如何在 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
假设我有节点 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