2014-10-03 219 views
0

我對Neo4J相當新,並且在Cypher查詢中遇到問題。Neo4J Cypher查詢 - 空關係

我寫通過Neo4j的java的暗號查詢和我Neo4j的數據庫設計如下:

我有屬性,如ID,姓名,年齡,電子郵件地址,性別和節點城市的用戶節點。每個用戶通過關係(生命)與城市節點(具有屬性id,名稱)相關。但是,當用戶與城市沒有關聯時可能會出現這種情況。

現在我的查詢場景是這樣的,我想獲取用戶和他住的城市的所有細節,在一個單一的查詢是。

match p, c, p-[:lives]->c where p.type = 'com.Person' and c.type='com.City' and p.id = 12345 return p.name, p.age, p.email, p.gender, c.name; 

查詢在用戶與城市相關時運行良好,但在用戶未與城市關聯時失敗。

你能幫我解決這兩種情況的查詢嗎?

回答

3
  1. MATCHWHERE條款實際上是要求所有匹配p必須與城市的關聯。您必須使用OPTIONAL MATCH子句進行可選匹配。
  2. 順便說一句,「MATCH p,c,p - [:lives] - > c」中的「p,c」是不必要的,效率也不高。

爲了得到你想要的結果,請嘗試以下(c.namenull如果沒有相關的城市):

MATCH (p {type: "Person", id: 12345}) 
OPTIONAL MATCH (p)-[:lives]->(c {type: "City"}) 
RETURN p.name, p.age, p.email, p.gender, c.name; 

另外,我強烈建議使用標籤PersonCity的爲您的pc節點(而不是type屬性)。這將使您的查詢更有效,也更清晰。如果您對節點進行了此更改,則查詢速度會更快:

MATCH (p:Person {id: 12345}) 
OPTIONAL MATCH (p)-[:lives]->(c:City) 
RETURN p.name, p.age, p.email, p.gender, c.name; 
+0

它工作正常。非常感謝你的幫助 !!! – 2014-10-03 08:02:07