我不知道如何表达这个问题,因为我什至不知道它叫什么,但我会尝试。
您可以想象我的 neo4j 实例中有以下图形表示和关系:
我想问 Neo4j 的问题如下:只有 Agency-A Actor 出演的电影是什么?
这只是一个简单的示例。就我而言,我有数千名加入经纪人的 Actor 以及一名 Actor 可能出演的数千部电影。
PS:如果您能告诉我我想做的事情的名称,我也将不胜感激:)
更新
我能够有一些可靠的工作。这是数据集:
CREATE (AgencyA:Agency {name: 'Agency-A'})
CREATE (Actor1:Person {name: 'Actor-1'})
CREATE (Actor2:Person {name: 'Actor-2'})
CREATE (Actor3:Person {name: 'Actor-3'})
CREATE (Actor4:Person {name: 'Actor-4'})
CREATE (Actor5:Person {name: 'Actor-5'})
CREATE
(AgencyA)-[:ACQUIRED]->(Actor1),
(AgencyA)-[:ACQUIRED]->(Actor3),
(AgencyA)-[:ACQUIRED]->(Actor5)
CREATE (MovieA:Movie {name: "Movie-A"})
CREATE (MovieB:Movie {name: "Movie-B"})
CREATE (MovieC:Movie {name: "Movie-C"})
CREATE
(MovieA)-[:EMPLOYED]->(Actor1),
(MovieA)-[:EMPLOYED]->(Actor5),
(MovieB)-[:EMPLOYED]->(Actor1),
(MovieB)-[:EMPLOYED]->(Actor3),
(MovieB)-[:EMPLOYED]->(Actor5),
(MovieC)-[:EMPLOYED]->(Actor2),
(MovieC)-[:EMPLOYED]->(Actor5)
这是查询:
MATCH (agency:Agency {name:"Agency-A"})-[:ACQUIRED]->(actor:Person)<-[:EMPLOYED]-(movie:Movie)
RETURN distinct movie.name
结果:
Movie-C
Movie-B
Movie-A
这不是我想要得到的。我感兴趣的是这部电影只聘用了A社 Actor ,没有其他 Actor 。所以,结果应该是:
Movie-A
Movie-B
最佳答案
在 Cypher 中,这非常简单:)
MATCH (agency:Agency {name:"AgencyA"})<-[:JOINED]-(actor:Actor)-[:ACTED_IN]->(movie:Movie)
RETURN distinct movie.name
如果 Actor 可能多次加入同一机构(因此与同一机构有多个 JOINED
关系),您需要在连接电影之前区分它们:
MATCH (agency:Agency {name:"AgencyA"})<-[:JOINED]-(actor:Actor)
WITH distinct actor as actor
MATCH (actor)-[:ACTED]->(movie:Movie)
RETURN distinct movie.name
更新
在澄清没有其他人可以在雇用 A 机构人员的电影中扮演角色后,这是一个有效的查询:
MATCH (agency:Agency { name:"Agency-A" })-[:ACQUIRED]->(actor:Person)<-[:EMPLOYED]-(movie:Movie)
WITH DISTINCT movie, collect(actor) AS actors
MATCH (movie)-[:EMPLOYED]->(allemployees:Person)
WITH movie, actors, count(allemployees) AS c
WHERE c = size(actors)
RETURN movie.name
在这里,我们将电影员工总数与代理机构 A 首先匹配的员工规模进行比较
您可以在这里测试:
关于graph - Neo4j 和多个项目、嵌套关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233230/