尝试在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]'
答案 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将持有预期的对抗。但仍在寻找更好/永久的解决方案