我正在使用名爲「uid」的屬性爲每個節點存儲唯一標識符。該屬性在所有類型中維護。但是,GraphDatabase.findNode(...)要求您傳入「label」的非空值。那麼,我該如何做一個跨類型的查找?如何在所有類型中使用索引屬性找到Neo4j節點?
,我能想到的唯一的事情是執行暗號查詢來做到這一點。
我正在使用名爲「uid」的屬性爲每個節點存儲唯一標識符。該屬性在所有類型中維護。但是,GraphDatabase.findNode(...)要求您傳入「label」的非空值。那麼,我該如何做一個跨類型的查找?如何在所有類型中使用索引屬性找到Neo4j節點?
,我能想到的唯一的事情是執行暗號查詢來做到這一點。
在這裏我看到兩個選項:
1)創建一個新的「超級」的標籤,所有的節點都和這個標籤上創建索引。
2)使用手動索引
1「超級」的標籤
由於節點可以有,你可以創建一個充當所有節點都有一個超級標籤的新標籤,多個標籤。然後在是標籤上創建uid
物業的模式索引和查詢它。
例如,假設您目前擁有的節點標籤User
和Customer
並要爲其中uid
屬性爲123
在兩個節點標籤節點做一個索引查找。
MATCH (a)
WHERE any(x in labels(a) WHERE x IN ["User", "Customer"])
SET a:Person;
現在在:Person(uid)
創建一個索引:即要麼User
或Customer
標籤的所有節點上創建一個新的標籤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();
謝謝。這非常有幫助。後續問題:將您的意見是關於下列方法是什麼:在球場上「UID」配置自動索引,然後,請使用.execute(...)查找通過查詢「MATCH一個節點(N {UID :{uid}})RETURN n「。這是一種反模式嗎? –
當然應該工作。自動索引本質上註冊了一個事務處理程序以將節點添加到手動索引。但是,您必須使用[START子句](http://neo4j.com/docs/developer-manual/3.1/cypher/clauses/start/)來搜索Cypher的手動索引。就個人而言,我會使用「超級」標籤方法來確保唯一性。 –
另一個後續問題:我找到了一個使用自動索引的參考,它建議START子句的索引名稱爲「node_auto_index」,並且該屬性名稱作爲參數傳遞。但是,當我從我的neo4j瀏覽器嘗試這個時,它報告「索引'node_auto_index'不存在」,我錯過了什麼? –
如何創建此UID屬性的值? – alexanoid
出於測試目的,我創建使用暗號聲明節點:CREATE(N:TEST {UID: 「測試」}) –