使用REST API通过Cypher查询删除节点和关系

6

我正在使用2.0 M6 neo4j服务器 (在win7 64上的oracle jdk7)。

我正尝试使用REST API通过单个cypher查询删除节点及其关系。

我创建的查询(如果在浏览器UI中运行,则有效)如下所示:

START n = node( 1916 ) MATCH n-[r]-() DELETE n, r

经过gson处理后,它变成了:

{"query":"START n \u003d node( 1916 ) MATCH n-[r]-() DELETE n, r"}

发送到服务器后,会得到响应:

{
  "columns" : [ ],
  "data" : [ ]
}

我的测试失败了,因为通过id在neo4j服务器仍然可以找到节点...

如果我简化查询,只删除一个没有关系的节点,那么代码如下:

START n = node( 1920 )  DELETE n

这将变成

{"query":"START n \u003d node( 1920 )  DELETE n"}

然后节点被删除。

我有遗漏什么吗?

谢谢,Andy

6个回答

15

对于 neo4j 2.0 版本,您需要执行以下操作:

START n=node(1916)
OPTIONAL MATCH n-[r]-()
DELETE r, n;

11

MATCH n-[r]-() 只有在至少有一个关系连接到节点时才会匹配该节点。

您想使关系匹配可选MATCH n-[r?]-()

此外,您需要在节点之前删除关系。

因此,您的完整查询如下:

START n=node(1916)
MATCH n-[r?]-()
DELETE r, n

这非常有道理,按照您的建议进行更改后,它完美地发挥作用:)谢谢。 - user2926169
6
这在 Neo4j 1.x 版本中是有效的。Neo4j 2 引入了新的语法:OPTIONAL MATCH n-[r]-()。请参考 Leland Cope 的答案。 - Nadjib Mami

8

现在已经逐步淘汰了START[r?]语法。通常也不建议直接使用内部id。可以尝试以下操作:

match (n{some_field:"some_val"}) optional match (n)-[r]-() delete n,r

(参考http://docs.neo4j.org/refcard/2.1/)


为了删除所有节点(包括未连接的节点)及其关系,您可以执行以下操作:MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r(很好,它也可以在一行中完成)。 - George Birbilis

4

再次有一个漂亮的语法变化。Neo4j 2.3引入了以下内容:

MATCH (n {id: 1916})
DETACH DELETE n

Detach自动删除所有的进出关系。


4

在Neo4J 2.0.3中不支持问号(?),因此答案是使用OPTIONAL MATCH

START n=node(nodeid) OPTIONAL MATCH n-[r]-() DELETE r, n;


0

基于最新的文档,我也进行了测试

START n=node(1578)
MATCH (n)-[r]-()
DELETE n,r

我们需要在 n 的周围加上 (),并且 [r?] 中也不需要 ?。

即使没有 OPTIONAL 也可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接