首页 文章

Neo4J Cypher查询 - 空关系

提问于
浏览
0

我是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 回答

  • 3
    • 您的 MATCHWHERE 条款实际上要求所有匹配的 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;
    

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

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

相关问题