对OPTIONAL MATCH子句的行为感到困惑

时间:2014-02-04 16:50:30

标签: neo4j

在Neo4j 2.0下运行。

我使用名为“type”的数组属性设计了一个Node类型系统。这是在标签之前完成的,我最终可能会转而使用标签。现在,我有以下删除查询:

START n = node(*) OPTIONAL MATCH n-[r]-() WHERE ANY(x in n.type WHERE x = 'TestType') DELETE n, r

请注意,在Neo4j 2.0之前,我使用了以下查询,该工作正常:

START n = node(*) MATCH n-[r?]-() WHERE ANY(x in n.type WHERE x = 'TestType') DELETE n, r

目的是删除所有类型为“TestType”的节点。 (OPTIONAL MATCH子句用于删除可能存在的任何关系,因此可以删除节点。)但是,这也会导致删除其他类型的节点。如果我删除OPTIONAL MATCH子句(并假设节点没有关系),这将按预期工作,只删除“TestType”类型的节点。

在尝试调试时,我将DELETE更改为RETURN并使用OPTIONAL MATCH子句查看了所有类型的节点。当我删除OPTIONAL MATCH子句时,只返回类型为'TestType'的节点。

这是一个错误还是我没有正确使用OPTIONAL MATCH?

感谢。

附录:

Dan G建议的查询产生了同样不正确的结果。找到所有节点而不仅仅是具有给定类型的节点。但是,以下查询有效,尽管我不太明白为什么我需要这样做:

START n=node(*)
WHERE 'TestType' IN n.`Node-typenames`
WITH n
OPTIONAL MATCH n-[r]-() DELETE n,r

有人可以帮助我更好地理解这一点吗?

1 个答案:

答案 0 :(得分:0)

以下工作如何:

Match (n)
optional match (n)-[r]->()
where 'TestType' in n.type
delete n,r
相关问题