Cypher:匹配具有子A和子B的节点

时间:2017-07-20 06:18:17

标签: neo4j cypher

我有以下描述X1 LIKES Alice, Bob, Carol X2 LIKES Alice X3 LIKES Bob, Carol, X4 LIKES Alice, Bob 的关系。

MATCH (p1)-[:LIKES]-(p2) WHERE p2.name IN ['Alice', 'Bob'] RETURN p1, p2

如果我想找到所有喜欢Alice AND Bob的人,Cypher的查询是什么? (应该返回X1和X4)

我试过了RecyclerView。但是,这会返回X1,X2,X3和X4,他们喜欢Alice OR Bob。

1 个答案:

答案 0 :(得分:0)

我们在Neo4j知识库中有一篇关于如何编写perform match intersection的查询的文章,就像您在此尝试做的那样。

将第一个解决方案应用于此案例,您可以使用的一个查询是:

MATCH (p1)-[:LIKES]-(p2:Person) 
WHERE p2.name IN ['Alice', 'Bob'] 
WITH p1, count(DISTINCT p2) as likesCount
WHERE likesCount = 2
RETURN p1

这里有一些值得注意的变化。

首先,我们使用标签:p2上的人,我假设您在:Person(name)上有索引或唯一约束,因此按名称查找是快速的

对于每个匹配的p1节点,如果匹配的p2节点数为2,则表示Alice和Bob都来自同一个p1节点。

如果我们想要概括这种方法,例如,如果我们接受了某个未知大小名称的列表参数,我们会将计数与输入列表的大小进行比较。