Java 在neo4j图上执行DFS

Java 在neo4j图上执行DFS,java,graph,neo4j,depth-first-search,graph-traversal,Java,Graph,Neo4j,Depth First Search,Graph Traversal,我有一个具有以下结构的数据库。 属性节点的类型为 create (A:Property {value:"abc"}) 如何进行dfs,以便能够打印图形中的所有值。顺序为a->B->E->F->C->G->H->D->I->J 关系r是向下的(单方向),没有属性。我尝试过这个,但看起来很复杂 是否有更简单的方法在现有的Neo4j数据库上执行简单的dfc您链接到的链接非常详细,涵盖了使用Neo4j强大的遍历API可以执行的所有不同操作 我想你所要做的就是: TraversalDescripti

我有一个具有以下结构的数据库。

属性节点的类型为

 create (A:Property {value:"abc"})
如何进行dfs,以便能够打印图形中的所有值。顺序为a->B->E->F->C->G->H->D->I->J

关系r是向下的(单方向),没有属性。我尝试过这个,但看起来很复杂


是否有更简单的方法在现有的Neo4j数据库上执行简单的dfc

您链接到的链接非常详细,涵盖了使用Neo4j强大的遍历API可以执行的所有不同操作

我想你所要做的就是:

TraversalDescription traversalDescription = graphDb.traversalDescription()
            .depthFirst()
            .relationships(YourRelationShipTypeR, Direction.OUTGOING);

    Node a = ... // however you find your node A

    try(ResourceIterator<Node> nodes =traversalDescription.traverse(a)
                                                       .nodes()
                                                       .iterator()){
        while(nodes.hasNext()){
            Node n = nodes.next();
            //or whatever property name you use to get your names for nodes
            System.out.print(n.getProperty("id") + "->");
        }

    }
其中,PathComparatorByName是我编写的一个比较器,它根据路径中遍历的节点按名称进行词汇排序:

private class PathComparatorByName implements Comparator<Path>{

    @Override
    public int compare(Path o1, Path o2) {
        Iterator<Node> iter1 = o1.nodes().iterator();
        Iterator<Node> iter2 = o2.nodes().iterator();


        while(iter1.hasNext()){
            if(!iter2.hasNext()){
                //return shorter path?
                return 1;
            }

            Node n1 = iter1.next();
            Node n2 = iter2.next();
            int nodeCmp = compareByNodeName(n1, n2);
            if(nodeCmp !=0){
                return nodeCmp;
            }

        }
        if(iter2.hasNext()){
            //return shorter path?
            return -1;
        }
        return 0;
    }

    private int compareByNodeName(Node node1, Node node2) {
        String name1 = (String)node1.getProperty("id");

         String name2 = (String)node2.getProperty("id");

        return name1.compareTo(name2);
    }

}

更新了对遍历路径进行排序以匹配用户所需输出的代码
private class PathComparatorByName implements Comparator<Path>{

    @Override
    public int compare(Path o1, Path o2) {
        Iterator<Node> iter1 = o1.nodes().iterator();
        Iterator<Node> iter2 = o2.nodes().iterator();


        while(iter1.hasNext()){
            if(!iter2.hasNext()){
                //return shorter path?
                return 1;
            }

            Node n1 = iter1.next();
            Node n2 = iter2.next();
            int nodeCmp = compareByNodeName(n1, n2);
            if(nodeCmp !=0){
                return nodeCmp;
            }

        }
        if(iter2.hasNext()){
            //return shorter path?
            return -1;
        }
        return 0;
    }

    private int compareByNodeName(Node node1, Node node2) {
        String name1 = (String)node1.getProperty("id");

         String name2 = (String)node2.getProperty("id");

        return name1.compareTo(name2);
    }

}
A->B->E->F->C->G->H->D->I->J->