Neo4j:查找所有节点指向的节点集
更准确地说,假设您有人和动物节点,以及从Neo4j:查找所有节点指向的节点集,neo4j,Neo4j,更准确地说,假设您有人和动物节点,以及从人到动物的:likes关系。问题是:我怎样才能找到人们喜欢的所有动物 例如: (Person {name: "Jake"})-[:likes]->(Animal {name: "Dog"}) (Person {name: "Maya"})-[:likes]->(Animal {name: "Dog"}) (Person {name: "Maya"})-[:likes]->(Animal {name: "Snake"}) (Person {
人到动物的:likes
关系。问题是:我怎样才能找到人们喜欢的所有动物
例如:
(Person {name: "Jake"})-[:likes]->(Animal {name: "Dog"})
(Person {name: "Maya"})-[:likes]->(Animal {name: "Dog"})
(Person {name: "Maya"})-[:likes]->(Animal {name: "Snake"})
(Person {name: "Jake"})-[:likes]->(Animal {name: "Cat"})
如果杰克和玛雅是人类的世界,那么杰克和玛雅都喜欢的动物集只包含狗。使用此示例数据集:
CREATE (jake:Person {name:'Jake'}),
(maya:Person {name:'Maya'}),
(dog:Animal {name:'Dog'}),
(snake:Animal {name:'Snake'}),
(cat:Animal {name:'Cat'}),
(jake)-[:LIKES]->(dog),
(jake)-[:LIKES]->(cat),
(maya)-[:LIKES]->(dog),
(maya)-[:LIKES]->(snake)
我认为以下内容读起来很好:
MATCH (p:Person)
MATCH (a:Animal)
WITH a, COLLECT(p) AS people
WHERE ALL(p IN people WHERE (p)-[:LIKES]->(a))
RETURN a.name
但速度不如:
MATCH (p:Person)
WITH COUNT(p) AS people
MATCH (p:Person)-[:LIKES]->(a:Animal)
WITH a, COUNT(p) AS likes, people
WHERE likes = people
RETURN a.name
所有人喜欢的动物集合(称之为“A”)必须与单个人喜欢的动物集合相同或是其子集。因此,我们可以通过测试随机人喜欢的动物来加快搜索速度
下面的查询统计人数(np),获取单个人喜欢的动物集(ca),并返回该集中np人喜欢的动物(如果有)
MATCH (p:Person)
WITH COUNT(p) AS np
MATCH (p:Person)-[:LIKES]->(a:Animal)
WITH p, COLLECT(a) AS ca, np
LIMIT 1
UNWIND ca AS a
MATCH (x:Person)-[:LIKES]->(a)
WITH a, COUNT(x) AS nx, np
WHERE nx = np
RETURN COLLECT(a) AS result;
太好了,谢谢!为了简洁起见,我选择了另一个答案。