作为较大查询的一部分,我尝试选择与多个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版本
答案 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