遍历的不同结果

时间:2016-06-03 02:19:30

标签: neo4j

Traversal API为看似相同的声明提供了不同的结果。在方法1中,我从neo4j的网站上获取了方法1样本。并尝试在方法2中对其进行重组。但是,显然没有区别,两种方法都产生不同的输出。 Method2完全跳过LIKE关系。即使我更改了method1中的序列,比如将depthFirst()放在最后,输出也会改变。

如果有人能帮助我理解这种不同的输出会很棒吗?

方法1:

void depthFirst() {

        GraphDatabaseBuilder graphDbBuilder = new GraphDatabaseFactory()
                .newEmbeddedDatabaseBuilder(storeDir);

        GraphDatabaseService graphDb = graphDbBuilder.newGraphDatabase();

        String output = "";
        int i = 0;

        try (Transaction tx = graphDb.beginTx()) {
            Node node = graphDb.findNode(LabelTyeps.Person, "name", "Joe");

            for (Path position : graphDb.traversalDescription().depthFirst()
                    .relationships(RelationshipTypes.KNOWS)
                    .relationships(RelationshipTypes.LIKES, Direction.INCOMING)
                    .evaluator(Evaluators.toDepth(5)).traverse(node)) {

                output += position.toString() + ":"
                        + (String) position.endNode().getProperty("name")
                        + "\n";
            }
            System.out.println(output);
        }
        graphDb.shutdown();
    }

方法1的输出:

(3):Joe
(3)<--[LIKES,1]--(8):Lisa
(3)<--[LIKES,1]--(8)--[KNOWS,2]-->(4):Lars
(3)<--[LIKES,1]--(8)--[KNOWS,2]-->(4)--[KNOWS,4]-->(7):Dirk
(3)<--[LIKES,1]--(8)--[KNOWS,2]-->(4)--[KNOWS,4]-->(7)--[KNOWS,5]-->(6):Peter
(3)<--[LIKES,1]--(8)--[KNOWS,2]-->(4)--[KNOWS,4]-->(7)--[KNOWS,5]-->(6)--[KNOWS,7]-->(5):Sara
(3)<--[LIKES,1]--(8)--[KNOWS,2]-->(4)<--[KNOWS,3]--(9):Ed

方法2 (刚改变了travDesc的结构方式)

try (Transaction tx = graphDb.beginTx()) {
            Node node = graphDb.findNode(LabelTyeps.Person, "name", "Joe");

            TraversalDescription travDesc = graphDb.traversalDescription();
            travDesc.depthFirst();
            travDesc.relationships(RelationshipTypes.KNOWS);
            travDesc.relationships(RelationshipTypes.LIKES, Direction.INCOMING);

            travDesc.evaluator(Evaluators.toDepth(5));

            for (Path position : travDesc.traverse(node)) {

                // System.out.println("Loop count: " + ++i);
                output += position.toString() + ":"
                        + (String) position.endNode().getProperty("name")
                        + "\n";
                // System.out.println(output);

            }
            System.out.println(output);

        }

方法2的输出

(3):Joe
(3)--[KNOWS,6]-->(5):Sara
(3)--[KNOWS,6]-->(5)<--[KNOWS,7]--(6):Peter
(3)--[KNOWS,6]-->(5)<--[KNOWS,7]--(6)<--[KNOWS,5]--(7):Dirk
(3)--[KNOWS,6]-->(5)<--[KNOWS,7]--(6)<--[KNOWS,5]--(7)<--[KNOWS,4]--(4):Lars
(3)--[KNOWS,6]-->(5)<--[KNOWS,7]--(6)<--[KNOWS,5]--(7)<--[KNOWS,4]--(4)<--[KNOWS,3]--(9):Ed
(3)--[KNOWS,6]-->(5)<--[KNOWS,7]--(6)<--[KNOWS,5]--(7)<--[KNOWS,4]--(4)<--[KNOWS,2]--(8):Lisa

示例数据:

create (:Person {name:"Joe"})
 ,(:Person{name:"Lars"})
 ,(:Person{name:"Sara"})
 ,(:Person{name:"Peter"})
 ,(:Person{name:"Dirk"})
 ,(:Person{name:"Lisa"})
 ,(:Person{name:"Ed"})

 match (a:Person{name:"Lisa"}), (b:Person{name:"Joe"}) create (a) - [:LIKES] -> (b)
 match (a:Person{name:"Lisa"}), (b:Person{name:"Lars"}) create (a) - [:KNOWS] -> (b)
 match (a:Person{name:"Ed"}), (b:Person{name:"Lars"}) create (a) - [:KNOWS] -> (b)
 match (a:Person{name:"Lars"}), (b:Person{name:"Dirk"}) create (a) - [:KNOWS] -> (b)
 match (a:Person{name:"Dirk"}), (b:Person{name:"Peter"}) create (a) - [:KNOWS] -> (b)
 match (a:Person{name:"Joe"}), (b:Person{name:"Sara"}) create (a) - [:KNOWS] -> (b)
 match (a:Person{name:"Peter"}), (b:Person{name:"Sara"}) create (a) - [:KNOWS] -> (b)

1 个答案:

答案 0 :(得分:0)

TraversalDescription是一个不可变的流畅API,引用格式http://neo4j.com/docs/java-reference/current/javadocs/org/neo4j/graphdb/traversal/TraversalDescription.html

  

遍历描述是不可变的,每个添加或修改行为的方法都会返回一个包含新修改的新实例,而实例将保留新实例的原样。