为什么我的Neo4j IN会因所有结果而返回false?

时间:2017-08-02 20:57:22

标签: neo4j cypher

我有以下查询:

MATCH (a)-[r1]-(b) WITH a, b, 
COLLECT(b.primaryId) AS bAll, r1
MATCH (b)-[r2]-(c)
RETURN c.primaryId IN bAll

特别是,我在此之后的深度为2个连接,也是深度为1的连接,即如果A与B和C相关,而B和C彼此相关。

这仅返回false。但是,当我返回c.primaryId, bAll时,我可以清楚地看到值中有一些重叠。我做错了什么?

编辑:包括样本回复

╒═══════╤═════════╕
│"id(c)"│"bAll"   │
╞═══════╪═════════╡
│1077598│[902604] │
├───────┼─────────┤
│195687 │[902604] │
├───────┼─────────┤
│461579 │[902604] │
├───────┼─────────┤
│1084085│[902604] │
├───────┼─────────┤
│1295819│[902604] │
├───────┼─────────┤
│316503 │[902604] │
├───────┼─────────┤
│1505256│[902604] │
├───────┼─────────┤
│1494600│[902604] │
├───────┼─────────┤
│708871 │[902604] │
├───────┼─────────┤
│319671 │[902604] │
├───────┼─────────┤
│957553 │[902604] │
├───────┼─────────┤
│394705 │[902604] │
├───────┼─────────┤
│379116 │[902604] │
├───────┼─────────┤
│1017683│[902604] │
├───────┼─────────┤
│330049 │[902604] │
├───────┼─────────┤
│567549 │[902604] │
├───────┼─────────┤
│344636 │[902604] │
├───────┼─────────┤
│1102414│[902604] │
├───────┼─────────┤
│598267 │[540185] │
├───────┼─────────┤
│829725 │[540185] │
├───────┼─────────┤
│1010574│[540185] │
├───────┼─────────┤
│1437190│[540185] │
├───────┼─────────┤
│1094878│[540185] │
├───────┼─────────┤
│19008  │[540185] │
├───────┼─────────┤
│1084085│[540185] │
├───────┼─────────┤
│366066 │[282808] │
├───────┼─────────┤
│1443101│[282808] │
├───────┼─────────┤
│433507 │[282808] │
├───────┼─────────┤
│1514110│[282808] │
├───────┼─────────┤
│1456009│[282808] │
├───────┼─────────┤
│146294 │[282808] │
├───────┼─────────┤
│29812  │[282808] │
├───────┼─────────┤
│889369 │[282808] │
├───────┼─────────┤
│221085 │[282808] │
├───────┼─────────┤
│1084085│[282808] │
├───────┼─────────┤
│17122  │[282808] │
├───────┼─────────┤
│79762  │[282808] │
├───────┼─────────┤
│887829 │[282808] │
├───────┼─────────┤
│375676 │[282808] │
├───────┼─────────┤
│1071899│[282808] │
├───────┼─────────┤
│1632753│[282808] │
├───────┼─────────┤
│1084085│[1748723]│
├───────┼─────────┤
│1071899│[1748723]│
├───────┼─────────┤
│710990 │[1748723]│
├───────┼─────────┤
│402609 │[269346] │
├───────┼─────────┤
│1711007│[269346] │
├───────┼─────────┤
│1408844│[269346] │
├───────┼─────────┤
│327082 │[269346] │
├───────┼─────────┤
│1575549│[269346] │
├───────┼─────────┤
│165601 │[269346] │
├───────┼─────────┤
│886370 │[269346] │
├───────┼─────────┤
│560737 │[269346] │
├───────┼─────────┤
│1084085│[269346] │
├───────┼─────────┤
│935787 │[269346] │
├───────┼─────────┤
│1448889│[269346] │
├───────┼─────────┤
│644901 │[269346] │
├───────┼─────────┤
│1415535│[269346] │
├───────┼─────────┤
│1713087│[269346] │
├───────┼─────────┤
│1084085│[122631] │
├───────┼─────────┤
│1384573│[122631] │
├───────┼─────────┤
│268383 │[1071899]│
├───────┼─────────┤
│1084085│[1071899]│
├───────┼─────────┤
│1748723│[1071899]│
├───────┼─────────┤
│282808 │[1071899]│
└───────┴─────────┘

1 个答案:

答案 0 :(得分:1)

COLLECT这样的Aggregation函数聚合了"分组键"。在您的查询中,WITH a, b, COLLECT(b.primaryId) AS bAll, r1使用abr1的组合作为分组键,因此bAll聚合始终只包含单primaryId个值(来自同一组中的b节点)。

以下内容可能更接近您的需求。对于每个节点a,它返回所有深度为2节点的primaryId值,这两个节点也是深度为1的节点。 (该查询简化了假设您的节点具有唯一primaryId值。)

MATCH (a)--(b)
WITH a, COLLECT(b) AS bs
UNWIND bs AS b
MATCH (b)--(c)
WHERE c IN bs
RETURN a, COLLECT(c.primaryId) AS cIds;

[UPDATE]

如果您还想返回所有r1关系,可以执行以下操作:

MATCH (a)-[r1]-(b)
WITH a, COLLECT(r1) AS r1s, COLLECT(b) AS bs
UNWIND bs AS b
MATCH (b)--(c)
WHERE c IN bs
RETURN a, r1s, COLLECT(c.primaryId) AS cIds;