有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在neo4j图上执行DFS

我有一个具有以下结构的数据库。 enter image description here

属性节点的类型为

 create (A:Property {value:"abc"})

如何执行dfs,以便能够打印图形中的所有值。顺序为A->;B->;E->;F->;C->;G->;H->;D->;I->;J

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

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


共 (1) 个答案

  1. # 1 楼答案

    您链接到的链接非常详细,涵盖了使用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") + "->");
            }
    
        }
    

    应该打印A->B->E->F->C->G->H->D->I->J->

    通过不在最后一个节点添加箭头,可以使print语句更智能,但我将留给您

    编辑

    在我自己尝试代码之后,我得到了深度优先搜索,但是迭代器的顺序是错误的。它似乎任意选择了要首先行走的子节点。所以我得到了像A->D->J->I->C->H->G->B->F->E->这样的输出

    因此,您必须对TraversalDescription的返回路径进行排序,该路径具有sort(Comparator<Path> )方法

    为了匹配您想要的遍历,我按照节点属性对路径进行排序,该属性为节点提供了名称,我称之为“id”。以下是我更新的遍历代码:

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

    其中,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);
        }
    
    }
    

    现在使用比较器重新运行它将输出:

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