Graph 如何在gremlin中获取名为ID的属性

Graph 如何在gremlin中获取名为ID的属性,graph,groovy,gremlin,Graph,Groovy,Gremlin,我在写一个小精灵的查询时得到了奇怪的结果。我可以很高兴地对节点的大多数属性使用has函数,例如“().has('name','verSignCzageXTension')。property('id')”将返回v5086。但是当我尝试使用带有属性id的has函数时,它永远不会返回true。例如“().has('id','v5086')。property('id')”不返回任何结果。有人知道为什么会这样吗 谢谢。在内部,Neo4j将所有ID存储为java.lang.Long对象。这只是id属性的特殊

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


谢谢。

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

AFAIK,
id
属性是不可变的(不能更改)。如果您需要使用
has
Gremlin步骤进行
id
查找顶点,它看起来像
has('id',5086L)
假设顶点
id
5086
,并且存储为
java.lang.Long
值。额外的
L
用于显式
java.lang.Long
类型转换,如果不添加
L
,Neo4j将假定
java.lang.Integer
,并且您的小精灵步骤将再次导致零结果

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


希望这能有所帮助。

您能否提供更多详细信息,如您在其版本中使用的数据存储(Neo4j、OrientDb、TinkerGraph等)?好的,
id
是一个保留属性,通常是数字。你确定你的
id
与现有的
id
属性没有冲突吗?该属性会随着每个节点/边缘的添加而自动递增?我使用的是Neo4j 1.8,我一直是cypher查询中的id属性,因此我假设它与Neo4j中的任何内容都没有冲突。虽然我不知道它是否与gremlin使用的id冲突。如果是这样的话,有趣的是,当我请求属性时,它仍然会给我提供的值。也许更好的问题是,如果它从属性函数返回正确的值,是否有类似于has的函数使用属性返回的值?