交叉口的交叉点

时间:2017-09-05 11:47:02

标签: neo4j cypher

拥有以下架构:

(A {id})-[:C]->(B)

我需要:

  1. (A {id:1})∩(A {id:2})∩(A {id:3})=> G1
  2. (A {id:4})∩(A {id:5})∩(A {id:6})=> G2
  3. G1∩G2
  4. 第三步不是问题,但我遇到了第1步和第2步的问题,因为这些组最多可以由A类的30个元素构成,并且

    MATCH (v:A{id: 1})-[:C]->(b:B)<-[:C]-(as:A) 
    WHERE as.id in [1,2,3]
    RETURN count(distinct b)
    

    生成联合而不是交集。可以用一个查询来解决这个问题吗?

    编辑:在第一步,我保存G1上第一个交叉点的结果和G2上第二个交叉点的结果。第三步使用这两组数据

1 个答案:

答案 0 :(得分:1)

您可以查看performing match intersection上的这篇neo4j知识库文章。

在文章中有几种方法可以做到这一点。将第一种方法应用于您的问题,这将为您提供以下所有的可达的B节点:集合中的节点:

WITH [1,2,3] as ids
MATCH (a:A)-[:C]->(b:B)
WHERE a.id in ids
WITH b, size(ids) as inputCnt, count(DISTINCT a) as cnt
WHERE cnt = inputCnt
RETURN b