【问题标题】:Neo4j : Filtering path with some nodes with cypherNeo4j:使用密码过滤一些节点的路径
【发布时间】:2017-11-23 11:24:23
【问题描述】:

我想要 A:Alpha 和 D:Alpha 之间的所有路径,而这两者之间只有 :Beta 节点。 如果路径包含相同类型或其他类型的节点,则应丢弃这些路径。

Sample data - 
A:Alpha->B:Beta->C:Beta->D:Alpha
A:Alpha->M:Beta->Z:Gama->P:Beta->D:Alpha
A:Alpha->S:Beta->F:Beta->I:Beta-->D:Alpha
A:Alpha->U:Beta->X:Alpha->T:Alpha->W:Beta->D:Alpha

Result should be - 
A:Alpha->B:Beta->C:Beta->D:Alpha
A:Alpha->S:Beta->F:Beta->I:Beta-->D:Alpha

任何人都可以帮助我使用密码吗?

谢谢

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    你只需要一个可变长度的路径和一个 WHERE all() 谓词来限制路径中间节点的标签:

    ... // assume 'path' variable used in the match
    WHERE all(node in nodes(path)[1..-1] WHERE node:Beta)
    ...
    

    或者,您可以使用APOC Procedures,因为路径扩展器的选项应该能够提供您想要的:

    MATCH (a:Alpha)
    CALL apoc.path.expandConfig(a, {relationshipFilter: '>', labelFilter:'/Alpha|+Beta' filterStartNode:false}) YIELD path
    RETURN path
    

    label filter 是这里的关键。 /Alpha 在 :Alpha 节点上创建一个终止节点过滤器,这意味着路径将仅遍历到遇到的第一个 :Alpha 节点而不超过,并且返回的路径将始终以 Alpha 节点结束。 +Beta 在 :Beta 节点上为路径中的节点创建一个白名单过滤器(当我们使用终止过滤器时,它不适用于结束节点),filterStartNode:false 表示开始节点不受白名单的约束过滤。

    这样可以确保路径只到达第一个 :Alpha 节点,并且路径中的所有中间节点都必须是 :Beta 节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 2014-01-09
      相关资源
      最近更新 更多