Neo4j中的定向路径

利沙克

我面临一个看似简单的问题。我想Neo4j使用遍历Java API遍历图的节点我只想包括所有关系具有相同方向的路径。如果我做类似的事情

db.traversalDescription().relationships(<type>, Direction.BOTH)

[a]-[:TYPE]->[b]<-[:TYPE]-[c] 

也包括我不想要的。我只想要像

[a]-[:TYPE]->[b]-[:TYPE]->[c]
[a]<-[:TYPE]-[b]<-[:TYPE]-[c]

有人可以帮忙吗?看来解决方案应该很简单。

斯蒂芬·阿姆布鲁斯特(Stefan Armbruster)

详细介绍Wes的想法。在您的定制中,PathEvaluator您需要设置分支状态以记住第一个关系的方向。所有后续访问都检查最后一个关系是否与方向匹配。用伪代码:

class SameDirectionPathEvaluator implements PathEvaluator<Direction> {

   public Evaluation evaluate(Path path, BranchState<Direction> state) {
      if (path.length()==0) {
         return Evaluation.EXCLUDE_AND_CONTINUE;
      } else if (path.length()==1) {
         state.setState(getDirectionOfLastRelationship(path));
         return Evaluation.INCLUDE_AND_CONTINUE;
      } else {
         if (state.getState().equals(getDirectionOfLastRelationship(path)) {
            return Evaluation.INCLUDE_AND_CONTINUE;
         } else {
            return Evaluation.EXCLUDE_AND_PRUNE;
         }
      }
   }

   private Direction getDirectionOfLastRelationship(Path path) {
      assert path.length() > 0;
      Direction direction = Direction.INCOMING
      if (path.endNode().equals(path.lastRelationship().getEndNode()) {
        direction = Direction.OUTGOING;
      }
      return direction;
   }

}

请注意,我没有编译或测试上面的代码-只是为了勾勒出这个想法。

更新

似乎有一种更有效的方法来执行此操作。由于遍历在调用评估程序之前使用扩展器,因此在扩展器中实现此行为更有意义:

     class ConstantDirectionExpander implements PathExpander<STATE>() {
        @Override
        public Iterable<Relationship> expand(Path path, BranchState<STATE> state) {
            if (path.length()==0) {
                return path.endNode().getRelationships(types);
            } else {
                Direction direction = getDirectionOfLastRelationship(path);
                return path.endNode().getRelationships(direction, types);
            }
        }

        @Override
        public PathExpander<STATE> reverse() {
            return this;
        }

        private Direction getDirectionOfLastRelationship(Path path) {
            assert path.length() > 0;
            Direction direction = Direction.INCOMING;
            if (path.endNode().equals(path.lastRelationship().getEndNode())) {
                direction = Direction.OUTGOING;
            }
            return direction;
        }
    }

在遍历中,您需要使用InitialBranchSate

TraversersDescription td = graphDatabaseService.traversalDescriptioin().
  .expand(new ConstantDirectionExpander(reltype))
  .traverse(startNode)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Neo4J从路径中的节点获取节点

来自分类Dev

Neo4j非托管扩展中的类路径

来自分类Dev

Neo4j中的多路径关系检查

来自分类Dev

(最短)路径中的Neo4J错误

来自分类Dev

Neo4j Cypher替代路径

来自分类Dev

Neo4j:最佳路径搜索

来自分类Dev

如何在Neo4J Cypher查询中仅从路径中检索节点?

来自分类Dev

Neo4j中的一对多最短路径查询支持

来自分类Dev

Neo4j中的一对多最短路径查询限制

来自分类Dev

获取与neo4j路径中的节点相关的所有节点

来自分类Dev

如何获取neo4j路径中的最后一个节点?

来自分类Dev

neo4j中具有一级关系的路径

来自分类Dev

在多个MATCH UNION查询中重用路径cypher neo4j

来自分类Dev

在Geoserver中为Neo4j数据源设置什么目录路径?

来自分类Dev

如果属性数大于n,则返回Neo4j中的路径

来自分类Dev

嵌入式数据库neo4j中按长度排序路径

来自分类Dev

Neo4j中的一对多最短路径查询支持

来自分类Dev

Neo4j中的一对多最短路径查询限制

来自分类Dev

Neo4j:如何从路径中的节点获取其他节点?

来自分类Dev

如何找出 Neo4j 路径中的重复节点标签?

来自分类Dev

如何从 Neo4j 路径中按顺序显示所有节点和关系的名称

来自分类Dev

在 NEO4j 中查找两个节点之间的间接路径

来自分类Dev

如何在 Neo4j 中更快地进行多级路径遍历

来自分类Dev

查询路径时如何在neo4j中更快?

来自分类Dev

如何在neo4j中的有向图上找到节点之间的最短路径?

来自分类Dev

如何在neo4j中查询确切路径并避免笛卡尔积?

来自分类Dev

Neo4j中的存储过程

来自分类Dev

neo4j中Edge的重量

来自分类Dev

neo4j中的超图建模