需要根据节点的一个属性值-USING JAVA和3.0.1 neo4j版本找到两个节点之间的最短路径

时间:2016-06-26 13:40:20

标签: neo4j spring-data-neo4j-4 neo4j-ogm

假设我的图表具有以下路径

System.Windows

假设具有下述属性的路径

      (3)<--[IS_LOCATED_AT,9]--(8)--[CARRIES,77]-->(53)<--[CARRIES,76]--(7)--[IS_LOCATED_AT,8]-->(2)
      (3)<--[IS_LOCATED_AT,9]--(8)--[BELONGS_TO,7]-->(1)<--[BELONGS_TO,6]--(7)--[IS_LOCATED_AT,8]-->(2)
      (3)<--[IS_LOCATED_AT,9]--(8)--[BELONGS_TO,7]-->(55)<--[BELONGS_TO,61]--(7)--[IS_LOCATED_AT,8]-->(2)
      (3)<--[IS_LOCATED_AT,9]--(8)--[CARRIES,77]-->(57)<--[CARRIES,75]--(7)--[IS_LOCATED_AT,8]-->(2)

假设如果我调用节点(3)和(2)之间的最短路径,则在调用下面提到的方法时,我得到以下输出。

假设当前输出为:

     (53) node has the properties--{Name:A}

     (1) node has properties--{Name:B}

     (55) node has properties--{Name:C}

     (57) node has properties-- {Name:D}

但我的要求是1)它应该在调用shortestpath api之前根据node属性过滤路径假设我的过滤器是{Name:D},这是上面提到的(57)节点的属性

然后我的输出应该如下所示,当下面提到的shortespath方法作为具有属性{Name:D}的节点(57)的下面路径时。

带过滤器的预期输出

        (3)<--[IS_LOCATED_AT,9]--(8)--[BELONGS_TO,7]-->(1)<--[BELONGS_TO,6]--(7)--[IS_LOCATED_AT,8]-->(2)
        (3)<--[IS_LOCATED_AT,9]--(8)--[BELONGS_TO,7]-->(55)<--[BELONGS_TO,61]--(7)--[IS_LOCATED_AT,8]-->(2)

我不想为此使用密码。任何人都可以帮助我。

          (3)<--[IS_LOCATED_AT,9]--(8)--[CARRIES,77]-->(57)<--[CARRIES,75]--(7)--[IS_LOCATED_AT,8]-->(2)

1 个答案:

答案 0 :(得分:1)

如果限制适用于路径上的至少一个节点(而不是每个节点),则上面的代码段将不起作用。这里适用的策略如下:

  1. 使用shortestPath.findAllPaths而不过滤节点属性
  2. 过滤您在1)中找到的最短路径,如果其中任何一个包含具有给定属性的节点。如果是:完成,否则:
  3. 使用GraphAlgoFactory.pathsWithLength()并询问长度为+ 1的路径(其中长度是步骤1中最短路径的长度)
  4. 检查长度为+ 1的任何路径是否符合条件(参见2)。如果没有使用length=length+1
  5. 返回3

    另一种方法是使用GraphDatabaseService.bidirectionalTraversalDescription()并在碰撞评估器中应用属性检查。但我认为这种方法比上面概述的策略更复杂。