首页 > 解决方案 > 如何根据关系返回不同的节点?

问题描述

在电影数据库中,我使用 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 关系且没有重复的电影(云图集)的所有演员?

这是密码查询,我试过了

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?对正确方向的任何见解都将受到高度赞赏。谢谢你。

标签: neo4jcypher

解决方案


在 Actor 节点之间使用Directed 和 Named (如果人之间有其他关系)关系:

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

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


推荐阅读