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



假设我们有一些这样的数据:

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

但这也会让查理回来。

如果你想找到一个口味完全相同的人,你可以使用这个查询:

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

最新更新