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;
查询在用户与城市相关时运行良好,但在用户未与城市关联时失败。
你能帮我解决这两种情况的查询吗?
答
- 你
MATCH
和WHERE
条款实际上是要求所有匹配p
必须与城市的关联。您必须使用OPTIONAL MATCH
子句进行可选匹配。 - 顺便说一句,“MATCH p,c,p - [:lives] - > c”中的“p,c”是不必要的,效率也不高。
为了得到你想要的结果,请尝试以下(c.name
将null
如果没有相关的城市):
MATCH (p {type: "Person", id: 12345})
OPTIONAL MATCH (p)-[:lives]->(c {type: "City"})
RETURN p.name, p.age, p.email, p.gender, c.name;
另外,我强烈建议使用标签Person
和City
的为您的p
和c
节点(而不是type
属性)。这将使您的查询更有效,也更清晰。如果您对节点进行了此更改,则查询速度会更快:
MATCH (p:Person {id: 12345})
OPTIONAL MATCH (p)-[:lives]->(c:City)
RETURN p.name, p.age, p.email, p.gender, c.name;
它工作正常。非常感谢你的帮助 !!! – 2014-10-03 08:02:07