Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j:查找所有节点指向的节点集_Neo4j - Fatal编程技术网

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;

太好了,谢谢!为了简洁起见,我选择了另一个答案。