【问题标题】:How to yield results in table without duplicate result in Cypher?如何在 Cypher 中产生没有重复结果的表中的结果?
【发布时间】:2021-12-07 13:02:55
【问题描述】:

假设我有节点 X,它链接到节点 A1、A2、A3 与边缘 A、节点 B1、B2 与边缘 B,以及节点 C1 与边缘 C。我想要这样的查询:

match (x)-[:A]->(a) 
match (x)<-[:B]-(b) 
match (x)-[:C]-(c) 
where x.name="X" 
return a.name,b.name,c.name

结果就是这张表:

a.name b.name c.name
A1 B1 C1
A2 B2
A3

不是 6 种组合的表格。那可能吗? RETURN 的 Neo4j 密码手册没有用。

【问题讨论】:

    标签: cypher


    【解决方案1】:

    我会这样做,与 Nathan 的回答相比,它的优势在于它也会在某些边缘类型丢失的情况下产生结果,例如当没有 B 边时。

    MATCH (x) WHERE x.name = 'X'
    WITH x,
         [(x)-[:A]->(a) | a] AS allAs,
         [(x)<-[:B]-(b) | b] AS allBs,
         [(x)-[:C]-(c) | c] AS allCs
    WITH x, allAs, allBs, allCs, apoc.coll.max([size(allAs), size(allBs), size(allCs)]) as maxSize
    UNWIND range(0, maxSize -1) as index
    RETURN allAs[index].name as A, allBs[index].name as B, allCs[index].name as C
    

    【讨论】:

      【解决方案2】:

      这将在输出的一行中返回与 a、b 和 c 匹配的每个节点。

      match (x)-[:A]->(a) 
      where x.name="X" 
      WITH x, collect(a) as allAs
      match (x)<-[:B]-(b) 
      WITH x, allAs, collect(b) as allBs
      match (x)-[:C]-(c) 
      WITH x, allAs, allBs, collect(c) as allCs
      WITH x, allAs, allBs, allCs, apoc.coll.max([size(allAs), size(allBs), size(allCs)]) as maxSize
      UNWIND range(0, maxSize -1) as index
      RETURN allAs[index].name as A, allBs[index].name as B, allCs[index].name as C
      

      【讨论】:

      • 我只是添加了一个替代方案,它的 MATCHes 更少,而且有一个优势。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2015-06-23
      • 2019-08-03
      相关资源
      最近更新 更多