【问题标题】:How to return distinct nodes based on relationship?如何根据关系返回不同的节点?
【发布时间】:2019-04-09 09:05:43
【问题描述】:

在电影数据库中,我使用 Cypher 查询在 Person 节点上创建了一个自我关系 (ACTED_WITH)。

MATCH (p1:Person)-[:ACTED_IN]->(m:Movie)
MATCH (p2:Person)-[:ACTED_IN]->(m)
WHERE p2 <> p1
OPTIONAL MATCH (p1)-[r:ACTED_WITH]-(p2)
FOREACH (n IN (CASE WHEN r IS NULL THEN [0] ELSE [] END) |
MERGE (p1)-[:ACTED_WITH]-(p2)  
)

我想返回具有 ACTED_WITH 关系且没有重复的电影 (Cloud Atlas) 的所有演员?

这是密码查询,我试过了

MATCH (m)-[:ACTED_IN]-(a1)-[r]-(a2)-[:ACTED_IN]-(m)
WHERE m.title="Cloud Atlas" RETURN a1,a2

查询返回 Tom Hanks 和 Hugo Weaving 两次(可能是由于双向关系?)。

"a1","a2"                                
{"name":"Tom Hanks","born":1956}, {"name":"Hugo Weaving","born":1960} 

{"name":"Hugo Weaving","born":1960}, {"name":"Tom Hanks","born":1956}

预期结果

"a1", "a2"                                
{"name":"Tom Hanks","born":1956}, {"name":"Hugo Weaving","born":1960} 

如何更改我的查询,以便只返回一次 Tom Hanks 和 Hugo Weaving?对正确方向的任何见解都将受到高度赞赏。谢谢。

【问题讨论】:

  • 尝试actor之间的有向关系:MATCH (m)-[:ACTED_IN]-(a1)-[r]->(a2)-[:ACTED_IN]-(m) WHERE m.title= 《云图》返回 a1,a2

标签: neo4j cypher


【解决方案1】:

使用Directed and Named (以防人与人之间有其他关系)Actor节点之间的关系:

MATCH (m:Movie)<-[:ACTED_IN]-(a1:Person)-[r:ACTED_WITH]->(a2:Person)-[:ACTED_IN]->(m)
WHERE m.title="Cloud Atlas" RETURN a1,a2

建议:使用标签名称以获得更好的性能和可读性

【讨论】:

    【解决方案2】:

    您可以尝试在查询中添加方向

    MATCH (m)-[:ACTED_IN]-(a1)-[r]->(a2)-[:ACTED_IN]-(m)
    WHERE m.title="Cloud Atlas" RETURN a1, a2
    

    它适用于我的数据集,但如果您在两个方向上都有重复的关系,它将不起作用。

    另一方面,重复关系似乎不是一个好习惯,您可以阅读更多here

    【讨论】:

    • 在查询中给出方向 ->(a2) 有帮助。我没有重复的任何关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多