【问题标题】:Neo4j Iterable<String> getPropertyKeys() loops infinitely? is this a bug?Neo4j Iterable<String> getPropertyKeys() 无限循环?这是一个错误吗?
【发布时间】:2015-03-07 04:25:16
【问题描述】:

我只是想从关系中复制属性键。如果我使用此代码。

        Iterable<String> tempkeys;
        tempkeys=  rel.getPropertyKeys();
        while (tempkeys.iterator().hasNext()){
            String key = tempkeys.iterator().next();
            System.out.println(key);
        }

它无限循环。如果我将 Iterable 重铸为 Arraylist,那么它可以完美运行

        ArrayList<String> tempkeys;
        tempkeys= (ArrayList<String>) rel.getPropertyKeys();
        for (int i=0;i<=tempkeys.size();i++) {
            String key = tempkeys.iterator().next();
            System.out.println(key);
        }

如果我调试代码,很明显可迭代计数器在每次调用 .next() 后重置为 0。它在调用期间递增到 1,但在下一次调用 .hasNext() 时又回到 0。

上下文如下。

    try (Transaction tx = this.graphDb.beginTx()) {
        Node Node1 = JavaCluster.AddUniqueNode("Element", "Name", "Node1");
        Node Node2 = JavaCluster.AddUniqueNode("Element", "Name", "Node2");
        RelationshipType tt = DynamicRelationshipType.withName("rt");
        Relationship rel = Node1.createRelationshipTo(Node2, tt);
        rel.setProperty("prop1", "propval1");
        rel.setProperty("prop2", "propval2");
        ArrayList<String> tempkeys;
        tempkeys= (ArrayList<String>) rel.getPropertyKeys();
        for (int i=0;i<=tempkeys.size();i++) {
            String key = tempkeys.iterator().next();
            System.out.println(key);
        }
        tx.success();
    } catch (Exception e) {
        System.out.println("Error - exception " + e.toString());
        //throw new TransactionFailException("Transaction failed",e);

    }

【问题讨论】:

    标签: java neo4j iterable embedded-database


    【解决方案1】:

    您在循环的每次迭代中创建一个新的迭代器,这意味着tempkeys.iterator().hasNext() 始终返回trueString key = tempkeys.iterator().next(); 始终返回第一个元素。

    您应该在循环外创建一次迭代器,并在每次调用next()hasNext() 时使用相同的迭代器。

        Iterable<String> tempkeys;
        tempkeys = rel.getPropertyKeys();
        Iterator<String> iter = tempkeys.iterator();
        while (iter.hasNext()) {
            String key = iter.next();
            System.out.println(key);
        }
    

    顺便说一句,您的第二个循环(for 循环)虽然不会产生无限循环,但仍然是错误的,因为它将在每次迭代中返回列表的第一个元素。

    【讨论】:

    • 谢谢,奇怪的是主代码中的等效循环 Iterable oldlinks = entity.getRelationships(Direction.INCOMING); while (oldlinks.iterator().hasNext()) { temprel = oldlinks.iterator().next();} 完美运行。为什么有些迭代器会被代码重新创建而另一些则不会?
    • 第二个循环当然被错误地编辑并且确实产生了正确的代码。在实际代码中它读取 newtemprel.setProperty(tempkeys.get(i), temprel.getProperty(tempkeys.get(i)));或等效于 Steing key=tempkeys.get(i); 上面的代码
    猜你喜欢
    • 1970-01-01
    • 2013-04-09
    • 2021-08-16
    • 2018-01-13
    • 2016-11-17
    • 2021-01-25
    相关资源
    最近更新 更多