2015-04-03 29 views
10

據我瞭解,由Neo4j(ID(node))給出的ID是不穩定的,行爲有點像SQL中的行號。由於ID主要用於SQL中的關係,並且這些在Neo4j中很容易建模,所以ID似乎沒有多大用處,但是如何解決特定節點的檢索問題?對於每個節點而言,擁有一個應該具有唯一路由的REST API(例如/api/concept/23)似乎是Web應用程序的一個非常標準的情況。 但是,儘管它是如此基本,我發現的唯一可行的辦法是要麼通過Neo4j中的自動遞增屬性

  • 特定語言的框架
  • 作爲保持增量未連接的節點:
// get unique id 
MERGE (id:UniqueId{name:'Person'}) 
ON CREATE SET id.count = 1 
ON MATCH SET id.count = id.count + 1 
WITH id.count AS uid 
// create Person node 
CREATE (p:Person{id:uid,firstName:'Gabriel',lastName:'Smith'}) 
RETURN p AS person 

來源:http://www.neo4j.org/graphgist?8012859

難道真的沒有一個簡單的方法,如果不是,我有沒有特別的理由呢?我的方法在Neo4j中是否爲反模式?

回答

7

Neo4j內部id比sql row id更穩定,因爲它們在交易期間永遠不會改變,例如,

不建議將它們暴露於外部使用。我知道Neo內部有一些意圖來實現這樣的功能。

基本上人們傾向於使用兩種方案來解決這個:

  1. 在像PHP應用程序級別使用UUID生成器:https://packagist.org/packages/rhumsaa/uuid和所有節點上添加一個標籤/ UUID唯一約束。

  2. 使用非常少數的Neo4j插件像https://github.com/graphaware/neo4j-uuid,將在飛行中添加的UUID的屬性,所以它刪除您的負擔,在應用程序級別來處理它,它是更容易管理您的節點的持續狀態對象

+2

這不回答這個問題。自動增量ID可用於按創建順序對對象進行排序,這是uuid無法完成的。 – 2016-08-29 10:34:40

+2

您的評論回答的問題是什麼? – 2016-08-29 11:54:56

+0

我相信給隨機唯一字符串添加一個unix時間戳或某種日期 - 時間前綴可以解決排序問題。 – Guy 2017-10-01 18:17:57