Neo4j:获取图中的所有节点,即使它们没有通过关系相连

51
使用Cypher如何获取图中的所有节点?我正在针对该图运行一些测试,并且有一些没有关系的节点,因此无法构建查询。
我想获取它们所有的原因是我想在每次测试开始时删除图中的所有节点。
4个回答

102

那么,这将给你所有节点:

MATCH (n)
RETURN n;

如果您想从图形中删除所有内容,可以这样做:

MATCH (n)
OPTIONAL MATCH (n)-[r]-() 
DELETE n, r;

针对2.0+版本进行了更新。

编辑: 现在在2.3版本中,它们有了DETACH DELETE,所以你可以做类似这样的事情:

MATCH (n)
DETACH DELETE n;

1
这会删除根节点吗?我想保留它。 - Aran Mulholland
2
好的,那么在“match”后面添加“where ID(n) <> 0”。 - Eve Freeman

14

这对你有用吗?

START a=node:index_name('*:*')

假设你有一个包含这些孤立节点的索引。


谢谢Jason,我从未见过那种语法 +1 - Aran Mulholland
1
语法参考在这里:http://docs.neo4j.org/chunked/snapshot/query-start.html#start-node-by-index-query - Peter Neubauer

7

在2.0版本中,这个功能可以正常工作:

    MATCH n RETURN n

1
使用neo4j时,括号是必须的:MATCH (n) RETURN n; - pyb

0
如果您需要从图中删除大量对象,则需要注意不要建立如此大的单个事务,以避免遇到Java OUT OF HEAP错误。
如果您的节点每个节点有超过100个关系((100+1)*10k=>1010k deletes),请减少批处理大小或查看底部的建议。

使用4.4及更高版本,您可以利用CALL {} IN TRANSACTIONS语法。

MATCH (n:Foo) where n.foo='bar'
CALL { WITH n
DETACH DELETE n
} IN TRANSACTIONS OF 10000 ROWS;

使用 APOC 进行 3.x 版本的向前迁移。
call apoc.periodic.iterate("MATCH (n:Foo) where n.foo='bar' return id(n) as id", "MATCH (n) WHERE id(n) = id DETACH DELETE n", {batchSize:10000})
yield batches, total return batches, total

关于在neo4j中删除大量数据的最佳实践,请遵循这些指南


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