Neo4J Cypher查询 - 空关系

问题描述:

我对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; 

查询在用户与城市相关时运行良好,但在用户未与城市关联时失败。

你能帮我解决这两种情况的查询吗?

  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