我在編寫gremlin查詢時收到了奇怪的結果。例如「().has('name','VerisignCzagExtension')。property('id')」將返回v5086。我可以愉快地使用has函數來獲取我節點的大部分屬性。但是,當我嘗試使用具有屬性ID的has函數時,它永遠不會返回true。例如「().has('id','v5086')。property('id')」不返回結果。任何人都知道爲什麼會發生這種情況?如何在gremlin中獲得一個名爲ID的屬性
謝謝。
我在編寫gremlin查詢時收到了奇怪的結果。例如「().has('name','VerisignCzagExtension')。property('id')」將返回v5086。我可以愉快地使用has函數來獲取我節點的大部分屬性。但是,當我嘗試使用具有屬性ID的has函數時,它永遠不會返回true。例如「().has('id','v5086')。property('id')」不返回結果。任何人都知道爲什麼會發生這種情況?如何在gremlin中獲得一個名爲ID的屬性
謝謝。
在內部,Neo4j將所有ID存儲爲java.lang.Long
對象。這是id
屬性的特殊行爲。所有其他屬性都與其隱含的數據類型一起存儲。這就是爲什麼has('name', 'VerisignCzagExtension')
有效的原因(,因爲name
屬性被排除在這個特殊行爲之外,意思是id
)。我假設v5086
正在輸入到java.lang.Long
,從而失去了它的實際價值。這可以解釋Gremlin步驟has('id', 'v5086')
後的零結果。
AFAIK,id
屬性是不可變的(不能更改)。如果您需要使用has
Gremlin步驟對頂點進行id
查找,則它將看起來類似has('id', 5086L)
,假定頂點id
爲5086
並且正在存儲爲java.lang.Long
值。額外的L
用於明確的java.lang.Long
類型轉換,如果您不添加L
並且您的Gremlin步驟會再次導致零結果,則Neo4j將假定爲java.lang.Integer
。
最後,您可能想要調用其他名稱的ID,如使用密鑰name
的屬性。
希望這會有所幫助。
非常感謝。 – user1690293
你能否提供更多的細節,比如你正在使用的數據存儲(Neo4j,OrientDb,TinkerGraph等)和它的版本? AFAIK,'id'是一個保留的屬性,通常是數字。你確定你的'id'不與現有的'id'屬性衝突嗎?每一個節點/邊緣添加都會自動遞增? – rhetonik
我使用Neo4j 1.8,並且我一直是密碼查詢中的id屬性,所以我會認爲它與Neo4j中的任何內容都沒有衝突。雖然我不知道它是否與gremlin使用的id衝突。儘管如此,但有趣的部分在於,它仍然向我提供我在要求物業時提供的價值。 也許更好的問題是,鑑於它從屬性函數返回正確的值,是否有類似的函數來使用屬性返回的值? – user1690293