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

问题描述 投票:1回答:1

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

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'})

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

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

我已经尝试过类似的事情

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

但是这也会返回查理。

neo4j cypher
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.