2014-03-13 143 views
45

我使用neo4j爲我的項目之一,有一個節點只有一個屬性爲name,我想要使用ID獲取該節點,它已經有一個ID,但是當我使用此代碼Neo4J通過ID獲取節點

MATCH (s:SKILLS{ID:65110}) return s

它沒有返回,我的繼承人節點

enter image description here

如果查詢是錯誤的,那麼我怎麼查詢它使用數字

回答

75
MATCH (s) 
WHERE ID(s) = 65110 
RETURN s 

ID function得到你的節點或關係的id。這與您創建的名爲idID的任何屬性都不同。

+1

有什麼不同的方式來得到這樣的數據(S:SomeLabel {ID:65110})? – DonkeyKong

+0

@DonkeyKong不,因爲你也可以添加id屬性,這是id以外的東西。一個id屬性可以有任何類型,而node或edge id是一個無符號整數,鏈接到Neo4J內部結構中的一個位置。 – pvoosten

+12

標準免責聲明:不要將內部Neo4j ID用於長期實體標識。出於性能的考慮,未來的Neo4j版本可能會將這些ID轉移。創建您自己的唯一ID屬性(理想情況下用'CONSTRAINT')來跟蹤實體 –

1

你可以說:

(n:User) where id(n) >=20 RETURN n 

這將返回一個類型用戶的所有節點與節點參考ID超過20

5

警告:以下答案不正確! START should only be used when accessing legacy indexes。這是disabled in Cypher 2.2 and up

的Neo4j recommends using WHERE ID(n) =,並進一步指出,它will only require a single lookup (does not scan every node to find the matching ID)

保持這個答案,防止別人犯同樣的錯誤。

可以使用WHERE ID(s) = 65110,但這會檢查每個節點的ID在你的數據庫。

有一種更有效的方式來做到這一點:

START s=NODE(517) MATCH(s) RETURN s 
+0

EXPLAIN和PROFILE的結果對於簡單的查詢顯示@Code是正確的。爲什麼這不在文檔中? – Sonata

+0

@Sonata你正在運行什麼版本?較新版本的Neo4j應該使START不再使用。 –

+0

3.0.7。在控制檯中查看這些示例中的「Result Details」:http://console.neo4j.org/r/dbz1we(執行AllNodesScan)和http://console.neo4j.org/r/9076wd(正在做NodeById) – Sonata