如何在 table 中产生结果而不在 Cypher 中产生重复结果?

How to yield results in table without duplicate result in Cypher?

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

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

结果是这样 table:

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

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

这将 return 每个与 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

我会这样做,与 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