如何使用Cypher在neo4j中查找已断开连接的节点?

3
我正在尝试使用neo4j,并注意到所有Cypher查询都需要在START子句中设置起始点。我想知道如何使用Cypher查找所有未连接的节点?谢谢。
4个回答

6
如果你的所有节点都被索引了(例如通过自动索引),你可以使用索引查询作为起点,然后找到那些没有出站关系的节点。
start n=node:node_auto_index("id:*")
match n-[r?]->m
where r is null
return n

现今我更倾向于使用:

start n=node:node_auto_index("id:*")
where not (n-->m)
return n

有没有办法进行追溯索引? - Dan
是的,但您需要创建所需的索引,然后浏览所有节点并在适当位置添加它们。在本机Java API中,您将使用GlobalGraphOperations.getAllNodes()。 - akollegger
很抱歉,我只能使用REST或Webadmin中的一个...还有希望吗? - Dan
应该可以使用Gremlin控制台完成。首先启用自动索引,然后执行Gremlin脚本。我手头没有语法,但是像g.V.each { it,idx - > it.id = idx }这样的内容应该足够了。 - Michael Hunger
这个回答并不好。查询仍然会匹配通过入站连接与图形相连的节点。 - drzax
如果您不关心节点类型、关系方向或关系的位置,可以进行轻微修改:START a=node(*) WHERE NOT ((a)--()) RETURN a; - firefly2442

4
使用 Neo4j v3.0+,我只需使用以下内容:
MATCH (n)
WHERE NOT (n)--()
RETURN n

(或其变种)。查询速度相当快。


2

我通常只在使用spring-data-neo4j时才会使用类似这样的东西:

    start n = node:__types__(className="com.app.entity.Model")
    // match, where...
    return n

希望这能有所帮助!

-1

不行。目前的Cypher无法进行全局图查询。


他们现在(Neo4j 1.7)使用start n=node(*) match ... where ... return n。 - Michael Hunger
这个回答最终可能会被踩,但在发布时它是准确的。 - George Birbilis

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