Neo4j 和多个项目、嵌套关系

Neo4j and Multiple Items, Nested Relationships

我不知道如何表达这个问题,因为我什至不知道它叫什么,但我会尝试。

你可以想象我的 neo4j 实例中有以下图形表示和关系:

我想问 Neo4j 的问题如下: movies only Agency-A actors 演过?

虽然这是一个简单的示例。就我而言,我有数千名加入代理人的演员和数千部演员可能扮演的电影。

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

这不是我想要的。我感兴趣的是只聘请了 Agency-A 演员的电影,没有聘请任何其他演员。所以,结果应该是:

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

更新

在澄清没有其他人可以在 Agency-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

在这里,我们将电影员工总数与 Agency-A 首先匹配的员工人数进行比较

你可以在这里测试它:

http://console.neo4j.org/r/s9t6en