如何获得具有相似/相同关系的节点?

时间:2019-10-06 08:47:57

标签: neo4j cypher

说我们有一些这样的数据:

create
(a:Person{name:'andy'})-[:LIKES]->(:Animal{name:'cat'}),
(b:Person{name:'bob'})-[:LIKES]->(:Animal{name:'cat'}),
(c:Person{name:'charlie'})-[:LIKES]->(:Animal{name:'cat'}),
(a)-[:LIKES]->(:Animal{name:'dog'}),
(b)-[:LIKES]->(:Animal{name:'dog'})

我想知道哪个人与安迪具有相同的赞。 安迪喜欢“猫”和“狗”,所以鲍勃应该出现,但查理不是,因为他不喜欢“狗”。

如何形成这样的查询? 我希望该查询可与许多LIKE一起使用,因此在将来有100只动物时,我仍然可以找到与Andy口味相同的人。

我已经尝试过这样的事情

match
(p:Person{name:'andy'})-[:LIKES]->(a:Animal),
(a)<-[:LIKES]-(p2:Person)
return p,a,p2

但这也会返回查理。

1 个答案:

答案 0 :(得分:0)

如果您想找到口味完全相同的人,可以使用以下查询:

MATCH (p:Person{name:'andy'})-[:LIKES]->(a:Animal)
WITH collect(a) AS likes
MATCH (p2:Person)
WHERE all(n IN likes WHERE exists((p2)-[:LIKES]->(n)))
RETURN p2, likes