2017-02-13 131 views
0

我正在使用名爲「uid」的屬性爲每個節點存儲唯一標識符。該屬性在所有類型中維護。但是,GraphDatabase.findNode(...)要求您傳入「label」的非空值。那麼,我該如何做一個跨類型的查找?如何在所有類型中使用索引屬性找到Neo4j節點?

,我能想到的唯一的事情是執行暗號查詢來做到這一點。

+0

如何創建此UID屬性的值? – alexanoid

+0

出於測試目的,我創建使用暗號聲明節點:CREATE(N:TEST {UID: 「測試」}) –

回答

4

在這裏我看到兩個選項:

1)創建一個新的「超級」的標籤,所有的節點都和這個標籤上創建索引。

2)使用手動索引

1「超級」的標籤

由於節點可以有,你可以創建一個充當所有節點都有一個超級標籤的新標籤,多個標籤。然後在標籤上創建uid物業的模式索引和查詢它。

例如,假設您目前擁有的節點標籤UserCustomer並要爲其中uid屬性爲123在兩個節點標籤節點做一個索引查找。

MATCH (a) 
WHERE any(x in labels(a) WHERE x IN ["User", "Customer"]) 
SET a:Person; 

現在在:Person(uid)創建一個索引:即要麼UserCustomer標籤的所有節點上創建一個新的標籤Person

CREATE INDEX ON :Person(uid); 

由於這是一個唯一的標識符它應該有一個唯一性約束(這將創建一個索引):

CREATE CONSTRAINT ON (p:Person) ASSERT p.uid IS UNIQUE; 

並搜索這個新的模式索引:

MATCH (p:Person {uid: "123"}) 
RETURN p 

或者因爲你是Java API:

Node person = graphdb.findNode("Person", "uid", "123") 

2.手動指數

既然你使用的是Java API,你也有creating a manual index的選項:

// Create index 
IndexManager index = graphdb.index(); 
Index<Node> people = index.forNodes("people"); 

// Add nodes to index 
Node user1 = graphdb.createNode(); 
user1.setProperty("uid", "123"); 

// Search index 
IndexHits<Node> hits = people.get("uid", "123"); 
Node user123 = hits.getSingle(); 
+0

謝謝。這非常有幫助。後續問題:將您的意見是關於下列方法是什麼:在球場上「UID」配置自動索引,然後,請使用.execute(...)查找通過查詢「MATCH一個節點(N {UID :{uid}})RETURN n「。這是一種反模式嗎? –

+0

當然應該工作。自動索引本質上註冊了一個事務處理程序以將節點添加到手動索引。但是,您必須使用[START子句](http://neo4j.com/docs/developer-manual/3.1/cypher/clauses/start/)來搜索Cypher的手動索引。就個人而言,我會使用「超級」標籤方法來確保唯一性。 –

+0

另一個後續問題:我找到了一個使用自動索引的參考,它建議START子句的索引名稱爲「node_auto_index」,並且該屬性名稱作爲參數傳遞。但是,當我從我的neo4j瀏覽器嘗試這個時,它報告「索引'node_auto_index'不存在」,我錯過了什麼? –

相關問題