与多个节点有关系的节点

时间:2018-10-25 13:48:04

标签: neo4j cypher

我想让那些认识一群人的人认识一些特定的地方。 这个:

MATCH (:Place {name:'Breiter Weg'})<-[:knows]-(b:Person)-[:knows]->(:Place   {name:'Buchhandel'})
WITH collect(DISTINCT b) as persons
Match (a:Person)
WHERE ALL(b in persons WHERE (a)-[:knows]->(b))
RETURN a

有效,但是第二部分在应用where子句之前进行了完整的nodelabelscan,这非常慢-在较大的数据库中,它需要8到9秒。我也尝试过:

MATCH (:Place {name:'Breiter Weg'})<-[:knows]-(b:Person)-[:knows]->(:Place {name:'Buchhandel'})
Match (a:Person)-[:knows]->(b)
RETURN a

这只需要2毫秒,但是它返回认识b组任何人的所有人,而不是认识每个人的所有人。

所以我的问题是:是否有有效/快速的查询来获取我想要的东西?

2 个答案:

答案 0 :(得分:0)

对于这种查询,我们有一个knowledge base article,其中显示了几种方法。

其中一个是与该小组认识的人员匹配,然后计算每个人员在结果中出现的次数。如果不存在多个:知道同一个人之间的关系,则如果该数量等于第一次匹配中的人的集合,则该人必须认识该集合中的所有人。

MATCH (:Place {name:'Breiter Weg'})<-[:knows]-(b:Person)-[:knows]->(:Place {name:'Buchhandel'})
WITH collect(b) as persons
UNWIND persons as b // so we have the entire list of persons along with each person
WITH size(persons) as total, b
MATCH (a:Person)-[:knows]->(b)
WITH total, a, count(a) as knownCount
WHERE total = knownCount
RETURN a

答案 1 :(得分:0)

这是一个更简单的Cypher查询,它也比较计数-@InverseFalcon使用的基本原理。

MATCH (:Place {name:'Breiter Weg'})<-[:knows]-(b:Person)-[:knows]->(:Place {name:'Buchhandel'}), (a:Person)-[:knows]->(b)
WITH COLLECT({a:a, b:b}) as data, COUNT(DISTINCT b) AS total
UNWIND data AS d
WITH total, d.a AS a, COUNT(d.b) AS bCount
WHERE total = bCount
RETURN a
相关问题