neo4j中具有一级关系的路径

时间:2013-11-16 01:08:06

标签: java neo4j

我有一个巨大的(20 * 10 ^ 6个节点)网络,我想返回一个从节点a到节点b的路径,让我们说长度为4.我的问题是我还需要显示这些孩子遍历的节点。 我可以很容易地找到一条路径:

public Path getPath( final Node nodeA, final Node nodeB, int depth )
{
    PathFinder<Path> finder = GraphAlgoFactory.allSimplePaths(
            Traversal.expanderForAllTypes(Direction.OUTGOING), depth);
    Path path = finder.findSinglePath( nodeA, nodeB );
    return path;
}

但是,我想拥有每个遍历节点的第一个子节点。 问题#1是无法添加到路径。

for (Node n: path.nodes()){
   path.add(n.childrens())
 }

在neo4j for java中解决这个问题的最佳方法是什么? 要么: 如何实现path.add()? - 我不明白PathExpander应该如何工作; - 我尝试了以下内容,但我被卡住了:

public void expand_path(Node X){
    final TraversalDescription TRAVERSAL = Traversal.description()
        .breadthFirst()
        .relationships(MyTypes.LOVE)
        .evaluator(Evaluators.toDepth(1))
        .uniqueness(Uniqueness.RELATIONSHIP_GLOBAL);

    for (Node n :TRAVERSAL.traverse(X).nodes()){
            //HELP!!!
        }

}
  • 我也尝试了几个小时的密码查询,但老实说,我不知道如何实现这个目标。

enter image description here

提前感谢大家

1 个答案:

答案 0 :(得分:3)

将这些子节点添加到路径中是没有意义的。从第二个图中可以看出,路径上的节点与子节点一起形成多个路径而不是单个路径。

我能想到的两件事可能会对你的目标有所帮助,

一种方法是获取路径并迭代路径上的节点,对于每个节点,获取所需类型的关系,然后获取路径上节点的另一端节点(子节点) ,

for ( Node nodeOnPath : path.nodes() ) 
{
    Relationship rel = nodeOnPath.getSingleRelationship(MyTypes.LOVE,  Direction.INCOMING)   
    Node childNode = rel.getOtherNode(nodeOnPath)
    // process the childNode
}

通过这种方式,您可以访问路径上的每个节点以及其子节点。

另一种方法是使用遍历框架获取通向末端节点的每条路径,并使用“MyTypes.Love”类型的附加关系扩展每个路径,以使用 ExtendedPath.extend将子节点包含到路径中(路径,爱情关系)

具体地说,假设您有两个给定节点“a”和“d”,以及“a”和“d”之间的路径,&lt; -b&lt; -c&lt; -d。

您将获得以下路径和扩展路径

a&lt; -b,a&lt; -b&lt; -childOfb
a&lt; -b&lt; -c,a&lt; -b&lt; -c&lt; -childOfC
a&lt; -b&lt; -c&lt; -d,a&lt; -b&lt; -c&lt; -d&lt; -childOfd

实现此目的的示例代码如下,

TraversalDescription td = Traversal.description()
              .depthFirst()
              .relationships(RelTypes.REL, Direction.INCOMING)
              .evaluator(new Evaluator() {
                @Override
                public Evaluation evaluate(final Path path) {
                    Node endNode = path.endNode();
                    if ( endNode.getProperty("name").equals('d') ){
                       return Evaluation.INCLUDE_AND_PRUNE;
                                        }
                    else {
                       return Evaluation.INCLUDE_AND_CONTINUE;
                    }

                }
            });

for ( Path path : td.traverse(aNode) ) {
   Iterator<Relationship> iter = endNode.getRelationships(RelTypes.LOVE,Direction.INCOMING).iterator();
  if ( iter.hasNext() ) {
     Path extendedPath = ExtendedPath.extend(path, iter.next());
     for ( Node enode :  extendedPath.nodes() )
         System.out.print(enode.getProperty("name") + "---");       
   }
}