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 首先匹配的员工人数进行比较
你可以在这里测试它:
我不知道如何表达这个问题,因为我什至不知道它叫什么,但我会尝试。
你可以想象我的 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 首先匹配的员工人数进行比较
你可以在这里测试它: