我有以下描述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。
答案 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
节点。
如果我们想要概括这种方法,例如,如果我们接受了某个未知大小名称的列表参数,我们会将计数与输入列表的大小进行比较。