在编写 gremlin 查询时,我得到了奇怪的结果。我可以愉快地为我的节点的大多数属性使用 has 函数,例如“ ().has('name', 'VerisignCzagExtension').property('id')”将返回 v5086。但是当我尝试使用带有属性 id 的 has 函数时,它永远不会返回 true。例如 " ().has('id', 'v5086').property('id')" 不返回任何结果。有人知道为什么会这样吗?
谢谢。
在内部,Neo4j 将所有 ID 存储为java.lang.Long
对象。id
这只是属性的特殊行为。所有其他属性都与其隐含的数据类型一起存储。这就是为什么has('name', 'VerisignCzagExtension')
起作用的原因(因为name
属性被排除在这种特殊行为之外id
)。我假设v5086
正在被强制转换为java.lang.Long
,因此失去了它的真正价值。has('id', 'v5086')
这可以解释Gremlin 步骤后的零结果。
AFAIK,id
属性是不可变的(无法更改)。如果您需要id
使用has
Gremlin 步骤查找顶点,它看起来就像has('id', 5086L)
假设顶点id
是5086
并且正在被存储为一个java.lang.Long
值。额外L
的是显式类型转换,如果您不添加java.lang.Long
,Neo4j 会假设您的 Gremlin 步骤将再次导致零结果。java.lang.Integer
L
最后,您可能希望将您的命名 ID 称为其他名称,例如带有 key 的属性name
。
希望这可以帮助。