Neo4j Iterable<String> getPropertyKeys() 无限循环?这是一个错误吗?

Posted

技术标签:

【中文标题】Neo4j Iterable<String> getPropertyKeys() 无限循环?这是一个错误吗?【英文标题】:Neo4j Iterable<String> getPropertyKeys() loops infinitely? is this a bug? 【发布时间】: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);

    

【问题讨论】:

【参考方案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); 上面的代码

以上是关于Neo4j Iterable<String> getPropertyKeys() 无限循环?这是一个错误吗?的主要内容,如果未能解决你的问题,请参考以下文章

_TypeError(类型 '_InternalLinkedHashMap<String, dynamic>' 不是类型 'Iterable<dynamic>' 的子类型) F

Flutter Json 未处理异常:类型“_InternalLinkedHashMap<String, dynamic>”不是“Iterable<dynamic>”类型的子类

使用 Guava 将 Iterable 转换为数组

试图附加到 Iterable[String]

为啥Java中的String类没有实现Iterable?

如何遍历两次Reduce中的Iterable<Text>values