Cypher查询结果不受“WITH”语句的影响

时间:2014-11-25 23:27:24

标签: neo4j cypher with-statement

作为较大查询的一部分,我尝试选择与多个PRODUCT有关系的SKU。我随后想要删除这些关系,并为了简单起见,执行此处未包含的其他修改。

我很惊讶地发现,当以下查询返回单个节点时:

MATCH (p:PRODUCT)-[p_s_rel:PRODUCT_SKU]->(s:SKU)
WITH s, p, count(s) AS sCount
WHERE sCount> 1 AND id(s) IN [9220, 9201]
RETURN s

WITH子句中添加关系p_s_rel会更改结果并且不返回任何节点:

MATCH (p:PRODUCT)-[p_s_rel:PRODUCT_SKU]->(s:SKU)
WITH s, p, p_s_rel, count(s) AS sCount
WHERE sCount> 1 AND id(s) IN [9220, 9201]
RETURN s

根据WITH的文档,我没有预料到这种行为。是否无法在WITH子句中指定关系标识符?

如果是这样,我如何删除示例中的p_s_rel关系?

编辑:这是2.1.5版本

1 个答案:

答案 0 :(得分:2)

您确定第一个查询正在执行您认为的那样吗?在您的查询中,如果sCount> 1然后我认为这意味着你在p和某些SKU之间有多个关系(即相同节点之间的多个关系)。如果您的WITH声明为WITH p, count(s) AS sCount,那么您将匹配单个产品与多个SKU。

执行WITH s, p, count(s) AS sCount即表示带有当前匹配的SKU,当前匹配的PRODUCT以及它们之间的PRODUCT_SKU关系,而WITH p, count(s) AS sCount将被视为带有当前匹配的PRODUCT以及它拥有的所有PRODUCT_SKU关系的计数

在你的第二个查询中,通过在你的WITH子句中包含p_s_rel,你将只传播每一个结果的一行 - 因为在每个匹配中只有一个不同的p_s_rel可以继承(仅一个关系)有一个起始节点和一个终端节点)。这意味着sCount永远不会大于1 - 因此您的空结果集。即你说携带当前匹配的SKU,当前匹配的PRODUCT,这两个节点之间的当前实际情况以及该关系上的终端节点的数量(1)。

如果你想要保持关系,你可以使用COLLECT,或者,因为你将通过SKU限制你的结果集,也许你最好先匹配那些:

MATCH (s1:SKU), (s2:SKU)
WHERE ID(s1) = 9220 AND ID(s2) = 9201
WITH s1, s2
MATCH (s1)<-[r1:PRODUCT_SKU]-(p:PRODUCT)-[r2:PRODUCT_SKU]->(s2)
DELETE r1, r2,
RETURN p