2016-07-24 52 views
0

Neo4j節點/關係ID是一種動態性質,從我在閱讀文檔和各種在線文章後可以知道的信息,它們可以重複使用。Neo4j OGM如何可靠地在節點/關係上工作?

因此,例如,比方說,我有一個操作O1上(x)操作,其具有100的ID的另一種操作O2可以刪除(x)並創建(y)(O1而被阻止,例如,由於一個I/O操作),巧合的是,(y)也可能會變成有一個節點ID爲100.當O1恢復執行,並試圖修改節點推測爲(x)(但現在實際上(y),但O1不能說,因爲它已經相同的節點ID),我們會爲該節點提供各種不良數據。

在與一定數量的OGMs(都是用PHP編寫的,儘管我懷疑其他語言也會應用OGMs)一起工作時,我能看到的是他們都依賴於ID,這可能會如上所述,往往會產生危險的後果。

Neo4j OGM如何處理這些情況?或者,上述案例「足夠稀少」(例如兩個UUID發生碰撞的概率相同),以免引起關注?

回答

0

我主要知道兩分的OGM的:

  • neo4j-ogm爲Java
  • 的​​紅寶石寶石(其中我的維護者之一)

我不能代表發言Java庫,但在Ruby方面,我們使用Ruby的SecureRandom.uuid在所有節點上生成uuid屬性。這是我們如何唯一識別節點。用戶也可以選擇擁有自己的「自然」鍵(如美國社會安全號碼)。只要它可以具有Neo4j UNIQUE約束,就可以使用它。

在當前穩定版本的gem(7.1)中,約束是自動創建的。在即將到來的主要版本(8.0)中,用戶需要自己創建這些約束條件(還有一個新的遷移系統可以幫助實現這個目標),但是如果沒有對某個屬性的ID屬性進行約束,gem會引發錯誤模型。另外,由於Neo4j/Neo Tech鼓勵從節點而不是關係的角度瀏覽Neo4j圖表,因此我們不會在關係中存儲唯一的ID。

+0

如何檢索沒有UUID的節點? (例如,那些可能已經從web界面創建而沒有uuid屬性的頁面) – user2064000

+0

您可以爲'Model.find_by_neo_id'做一件事,但通常您要確保那裏有一個UUID。我們有一個遷移,可以找到沒有UUID的節點並添加它們,這樣有幫助。另外,Ruby的'SecureRandom.uuid'基於RFC 4122,所以如果你在那裏創建節點,那麼應該有其他語言的實現 –

+0

(還有'Model.find_by(neo_id:123)','Model.find_by(other_property: value)','Model.where(prop:value)'等等) –