2012-01-29 189 views
50

我是Neo4j的新手 - 昨天晚上剛剛開始玩。neo4j中的節點標識符

我注意到所有節點都是通過在節點創建期間生成的自動遞增整數來標識的 - 這種情況總是如此嗎?

我的數據集有自然的字符串鍵,所以我想避免必須在Neo4j分配的id和我自己之間進行映射。是否可以使用字符串標識符?

回答

64

將node-id視爲實現細節(如關係數據庫的rowid,可用於標識節點,但不應依賴於永不重複使用)。

您可以將自然鍵作爲屬性添加到節點,然後使用自然鍵爲節點編制索引(或爲其啓用自動索引)。

E..g Java API中:

Index<Node> idIndex = db.index().forNodes("identifiers"); 

Node n = db.createNode(); 
n.setProperty("id", "my-natural-key"); 
idIndex.add(n, "id",n.getProperty("id")); 

// later 
Node n = idIndex.get("id","my-natural-key").getSingle(); // node or null 

具有自動索引你會啓用自動索引你的 「ID」 字段。

// via configuration 
GraphDatabaseService db = new EmbeddedGraphDatabase("path/to/db", 
MapUtils.stringMap( 
    Config.NODE_KEYS_INDEXABLE, "id", Config.NODE_AUTO_INDEXING, "true")); 

// programmatic (not persistent) 
db.index().getNodeAutoIndexer().startAutoIndexingProperty("id"); 

// Nodes with property "id" will be automatically indexed at tx-commit 
Node n = db.createNode(); 
n.setProperty("id", "my-natural-key"); 

// Usage 
ReadableIndex<Node> autoIndex = db.index().getNodeAutoIndexer().getAutoIndex(); 
Node n = autoIndex.get("id","my-natural-key").getSingle(); 

參見:http://docs.neo4j.org/chunked/milestone/auto-indexing.html 和:http://docs.neo4j.org/chunked/milestone/indexing.html

+8

謝謝邁克爾,正是我需要知道的。這種東西顯然不是太主流,文檔和討論非常輕鬆! – 2012-01-29 16:10:31

+2

@Michael飢餓當你調用n.setProperty(「id」,「my-natural-key」);你正在創建一個與neo4j創建的自動生成節點ide不同的id嗎?或者這是一個嘗試覆蓋neo4j正在使用的ID? – 2013-06-18 21:17:01

+0

@ michael-hunger是否可以添加自動增量屬性?還是必須爲我創建的節點創建唯一的ID? – satoru 2014-03-12 03:38:16

0

這應有助於:

創建批量導入期間備份自動索引我們 知道,如果自動索引中的Neo4j啓用索引。屬性,創建的每個節點 將被添加到名爲node_auto_index的索引中。現在, 這裏是很酷的位。如果我們添加原始手動索引(在批量導入的時間點 ),並將其命名爲node_auto_index並在neo4j中啓用自動索引編制,則批量插入節點將顯示爲自動索引。從那裏,每次您創建一個節點,該節點 將獲得索引以及**

來源:Identifying nodes with Custom Keys

0

除了所有的答案仍然neo4j創建自己的ID更快地工作和更好地服務。請確保內部系統不會在ID之間發生衝突,那麼它將創建具有相同屬性的節點,並在系統中顯示爲空節點。

1

可以在Neo4J中爲節點/事實設置唯一的ID。您可以通過將其設置爲其中一個配置文件來將其設置爲索引。

此外,這是強烈建議,即爲您的節點和邊緣提出一個「自然」的身份證,而不是使用Neo4j seq id。這將爲您節省往返數據庫的往返行程。這是我過去所做的。