【问题标题】:Neo4j cypher - search for nodes with no path between themNeo4j cypher - 搜索它们之间没有路径的节点
【发布时间】:2015-01-05 10:59:31
【问题描述】:

我正在尝试找到一种通用方法来搜索一个节点或一组节点,该节点或一组节点没有与另一个节点或一组节点的链接。 例如,我能够找到所有特定类型的节点(例如:Style),这些节点以某种方式连接到一组特定的节点(例如:MetadataRoot),具体如下:

match (root:MetadataRoot),
(n:Style),
p=shortestPath((root)-[*]-(n))
return p

使用它,我能够从上述查询返回的节点中减去 all :Style 节点集,但这似乎不是解决此问题的最佳方法。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    如果你知道起始节点的标签,你可以使用 EXISTS 函数:

    MATCH (n:Style)
    WHERE NOT EXISTS((n)-[]-())
    RETURN n
    

    如果你知道结束节点:

    MATCH (n:Style)
    WHERE NOT EXISTS ((n)-[*]-(:MetadataRoot))
    RETURN n
    

    编辑:

    不确定,但关于您评论中的性能问题,解决方法可能是这样的:

    MATCH p=allShortestPaths((n:Style)-[*]-(:MetadataRoot))
    WITH nodes(p) as nodesRelated
    MATCH (s:Style) WHERE NOT s IN nodesRelated
    

    【讨论】:

    • 当路径长度很小时(在我的服务器上,10 或更少)似乎可以工作。如果它试图找到更大的东西,它就会崩溃。最短路径算法快速高效;我希望在这种情况下也有类似的东西,比如 hasPathTo() 或 pathNotExists()
    • mmh 也许一种解决方法是首先匹配具有 allShortestPaths 路径的节点,然后将它们聚合到一个集合中。之后匹配不在该集合中的所有所需节点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多