Neo4j:如何修复match子句中的一个节点?

时间:2017-04-21 21:25:46

标签: neo4j cypher

对于像MATCH (a:Address)-[:BelongTo]->(w1:Wallet), (a)-[r0:BelongTo]->(w2:Wallet) WHERE ID(w1)>ID(w2) WITH w1, w2...这样的条款,是否可以确保ex。 w1总是一个固定的节点?如果是,是否可以通过选择具有ex的节点来决定节点。所有节点上某个属性的最小值,也可能是w1?

更具体地,例如,地址a属于钱包a,b,c,在ID方面具有> b> c。然后通常会返回这些结果行:

w1 w2
--------
a    b
b    c
a    c

我只想要返回这两行结果:

w1 w2
--------
a    b
a    c

注意:我希望查询尝试将每对钱包都放到一个地址所属的地方。如果返回a,则应包括属于两个或更多钱包的所有地址。

例如,如果有两个地址属于三个不同的钱包,那么您发布的查询会做什么? 更具体地,如果地址a1和a2分别属于b1,c1,d1和b2,c2,d2(以id为b1> c1> d1> b2> c2> d2)

我希望它返回:

a    w1   w2
-----------
a1  b1    c1
a1  b1    d1
a2  b2    c2
a2  b2    d2

有可能吗?

1 个答案:

答案 0 :(得分:0)

是的,您可以通过查找(对于每个a:地址),具有最小ID的钱包来执行此操作。在你匹配之后:钱包,你可以匹配所有其他:钱包。

MATCH  (a:Address)-[:BelongTo]->(w1:Wallet)
WITH a, min(id(w1)) as minId
// since we have the minId, we can do a fast lookup of the node
MATCH (minW:Wallet)
WHERE id(minW) = minId
// now get all the others
MATCH (a)-[:BelongTo]->(w2:Wallet)
WHERE minW <> w2
...

如果您不关心固定节点的使用方式,并且只关注查询的持续时间,则可能更容易收集所有:电子钱包节点,获取集合中的第一个节点,然后将其余部分UNWIND成行并继续查询:

MATCH  (a:Address)-[:BelongTo]->(w:Wallet)
WITH a, collect(w) as wallets
WITH a, head(wallets) as w1, wallets
UNWIND tail(wallets) as w2
...