2012-12-25 43 views
1

我在編寫gremlin查詢時收到了奇怪的結果。例如「().has('name','VerisignCzagExtension')。property('id')」將返回v5086。我可以愉快地使用has函數來獲取我節點的大部分屬性。但是,當我嘗試使用具有屬性ID的has函數時,它永遠不會返回true。例如「().has('id','v5086')。property('id')」不返回結果。任何人都知道爲什麼會發生這種情況?如何在gremlin中獲得一個名爲ID的屬性

謝謝。

+0

你能否提供更多的細節,比如你正在使用的數據存儲(Neo4j,OrientDb,TinkerGraph等)和它的版本? AFAIK,'id'是一個保留的屬性,通常是數字。你確定你的'id'不與現有的'id'屬性衝突嗎?每一個節點/邊緣添加都會自動遞增? – rhetonik

+0

我使用Neo4j 1.8,並且我一直是密碼查詢中的id屬性,所以我會認爲它與Neo4j中的任何內容都沒有衝突。雖然我不知道它是否與gremlin使用的id衝突。儘管如此,但有趣的部分在於,它仍然向我提供我在要求物業時提供的價值。 也許更好的問題是,鑑於它從屬性函數返回正確的值,是否有類似的函數來使用屬性返回的值? – user1690293

回答

2

在內部,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),假定頂點id5086並且正在存儲爲java.lang.Long值。額外的L用於明確的java.lang.Long類型轉換,如果您不添加L並且您的Gremlin步驟會再次導致零結果,則Neo4j將假定爲java.lang.Integer

最後,您可能想要調用其他名稱的ID,如使用密鑰name的屬性。

希望這會有所幫助。

+0

非常感謝。 – user1690293