我是Neo4J的新手,在Cypher查询中遇到问题。
我通过Neo4J java编写cypher查询,我的Neo4J数据库设计如下:
我有一个用户节点,其中包含id,name,age,email,gender和node city等属性。每个用户通过关系(生活)与城市节点(具有属性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;
当用户与城市相关时,查询效果很好,但如果用户未与城市相关联,则查询失败。
您能否帮我解决一下可以处理这两种情况的问题。
答案 0 :(得分:3)
MATCH
和WHERE
条款实际上要求所有匹配的p
必须与城市相关联。您必须使用OPTIONAL MATCH
子句进行可选匹配。要获得您想要的结果,请尝试以下操作(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;