1

在编写 gremlin 查询时,我得到了奇怪的结果。我可以愉快地为我的节点的大多数属性使用 has 函数,例如“ ().has('name', 'VerisignCzagExtension').property('id')”将返回 v5086。但是当我尝试使用带有属性 id 的 has 函数时,它永远不会返回 true。例如 " ().has('id', 'v5086').property('id')" 不返回任何结果。有人知道为什么会这样吗?

谢谢。

4

1 回答 1

2

在内部,Neo4j 将所有 ID 存储为java.lang.Long对象。id这只是属性的特殊行为。所有其他属性都与其隐含的数据类型一起存储。这就是为什么has('name', 'VerisignCzagExtension')起作用的原因(因为name属性被排除在这种特殊行为之外id)。我假设v5086正在被强制转换为java.lang.Long,因此失去了它的真正价值。has('id', 'v5086')这可以解释Gremlin 步骤后的零结果。

AFAIK,id属性是不可变的(无法更改)。如果您需要id使用hasGremlin 步骤查找顶点,它看起来就像has('id', 5086L)假设顶点id5086并且正在被存储为一个java.lang.Long值。额外L的是显式类型转换,如果您不添加java.lang.Long,Neo4j 会假设您的 Gremlin 步骤将再次导致零结果。java.lang.IntegerL

最后,您可能希望将您的命名 ID 称为其他名称,例如带有 key 的属性name

希望这可以帮助。

于 2012-12-26T13:41:25.797 回答