Neo4J Cypher查询 - 空关系

时间:2014-10-03 06:52:36

标签: neo4j cypher spring-data-neo4j

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

当用户与城市相关时,查询效果很好,但如果用户未与城市相关联,则查询失败。

您能否帮我解决一下可以处理这两种情况的问题。

1 个答案:

答案 0 :(得分:3)

  1. 您的MATCHWHERE条款实际上要求所有匹配的p必须与城市相关联。您必须使用OPTIONAL MATCH子句进行可选匹配。
  2. 顺便说一下," p,c" in" MATCH p,c,p - [:lives] - > c"是不必要的,效率低下。
  3. 要获得您想要的结果,请尝试以下操作(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;
    

    此外,我强烈建议您为PersonCity节点(而不是p属性)使用标签ctype 。这将使您的查询更有效,也更清晰。如果对节点进行了此更改,则查询速度会更快:

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