Neo4j 如何获得具有相似/相同关系的节点?
假设我们有如下数据:Neo4j 如何获得具有相似/相同关系的节点?,neo4j,cypher,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)-[:LIKE
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
匹配
(p:Person{name:'andy})-[:LIKES]->(a:Animal),
(a) 如果您想找到完全相同口味的人,可以使用以下查询:
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
如果您想找到完全相同口味的人,可以使用以下查询:
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