Neo4j - Cypher查询返回错误的节点

时间:2013-12-27 09:18:30

标签: neo4j cypher

尝试在cypher中查询具有自动索引的节点时,它返回不相关的节点, 如下图所示,我查询了contno ='GESU5697150'的节点,但它也返回了其他节点。

neo4j-sh (0)$ start n=node:node_auto_index(contno='GESU5697150')  return n;
==> +----------------------------------------------------+
==> | n                                                  |
==> +----------------------------------------------------+
==> | Node[546290]{contno:"UACU5047693",sizetype:"40HC"} |
==> | Node[700914]{contno:"GESU5697150",sizetype:"40HC"} |
==> +----------------------------------------------------+
==> 2 rows 

这是cypher / Neo4j的问题吗?因此我在java代码中获取记录时遇到问题

Ncontno = autoNodeIndex.get("contno", contno).getSingle();

它会抛出错误

Exception in thread "main" java.util.NoSuchElementException: More than one eleme
nt in org.neo4j.index.impl.lucene.LuceneIndex$1@211b3c6a. First element is 'Node
[546290]' and the second element is 'Node[700914]'

2 个答案:

答案 0 :(得分:1)

在自动索引配置更改时,Neo4j中的自动索引不关心重新编制现有内容的索引。如果在更改contno属性时关闭了自动索引,您将看到所描述的行为。

要解决此问题,您可以使用其预先存在的值设置属性,从而触发自动索引的隐式更新:

start n=node:node_auto_index(contno='GESU5697150') set n.contno = n.contno

重新运行原始查询应该只返回一个元素。

Neo4j 2.0中的模式索引解决了这种不方便的行为,请参阅Neo4j中的blog post on various index types

答案 1 :(得分:0)

通过验证结果集集合中的contno,我得到了上述问题的临时解决方案。

hits = container.get("contno", contno);
  for (Node n : hits) {
    if (n.getProperty("contno").toString().equalsIgnoreCase(contno)) {
           Ncontno = n;
    } 
  }
因此,Ncontno将持有预期的对抗。但仍在寻找更好/永久的解决方案