neo4j - 如何根据关系返回不同的节点?
问题描述
在电影数据库中,我使用 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?对正确方向的任何见解都将受到高度赞赏。谢谢你。
解决方案
在 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
建议:使用标签名称以获得更好的性能和可读性
推荐阅读
- javascript - 获取随机 Discord 用户
- swift - 防止 GKGridGraph 在寻路时崩溃
- button - BackgroundImage Javafx 组合框
- maven - maven 版本在哪里被覆盖?
- neural-network - 如何使用自组织地图对数据进行聚类?
- ajax - ReactJS Fetch 替代这个 AJAX 样板
- python - 向下舍入/截断大浮点数
- django - 如何过滤 FK 中包含的对象?
- php - {{asset('css/app.css')}} 和 laravel 中的 {{mix('css/app.css')}} 一样吗
- twitter-bootstrap - 如何在 Asp.net core 2.0.9 Web 应用程序中启用引导程序