2017-02-05 106 views
0

嘗試獲取某個標籤類型的所有節點。我有多個圖形的根,它們的標籤中都有相同的後綴。例如,我有3個節點,它們的標籤末尾都有treeroot。所以我可以將companytreeroot,buildingtreerootemployeetreeroot作爲3個不同節點的3個有效標籤。我將如何獲得標籤具有該模式的所有節點?如何查找neo4j中包含字符串的所有標籤

我想:

match (n) where '.*treeroot' in labels(n) return n 

match (n) where 'treeroot' in labels(n) return n 

但都返回空套...

+0

不確定這會幫助你,但節點可以是多重標記。如果這不是可用的字符串匹配,而是需要一次獲取跨多個相似標籤的節點,那麼您可以考慮將標籤作爲超級標籤添加到這些節點。就像將TreeRoot標籤添加到具有某些treeroot標籤(companytreeroot,buildingtreeroot,employeetreeroot)的所有節點一樣,並確保將TreeRoot添加到這些標籤的任何新節點。這會讓你對這些問題的查詢比執行整個圖表掃描更有效率。 – InverseFalcon

+0

這些匹配只會檢查完整的字符串。 @ InverseFalcon的答案是最有效的。一。 –

回答

1

可以使用ANY function爲申請reqular表達標籤:

match (n) where ANY(l in labels(n) WHERE l =~ ".*treeroot") 
return n 
2

stdob - 答案有效,但它必須檢查圖形中所有節點的所有標籤,因此隨着圖形增長,這變得越來越昂貴。

更快的方法包括首先使用db.labels()過程首先查找匹配的標籤,然後(因爲Cypher本身不支持動態標籤查詢)使用APOC Procedures' cypher.run()過程來使用字符串串聯來組裝查找的查詢所有符合您匹配條件的標籤中的所有節點。

這裏的,應該是相當快的,即使在大圖的例子:如果

CALL db.labels() YIELD label 
WITH label 
WHERE label ENDS WITH 'treeroot' 
CALL apoc.cypher.run('MATCH (n:' + label + ') return n', null) YIELD value 
RETURN value.n as node 
+0

好的! apoc也是很好的例子。 –

+0

@MichaelHunger在很多時候,它確實是Neo4j的金錘。 – InverseFalcon

+0

@InverseFalcon獲取匹配標籤列表 - 一個好主意!並感謝您指出「db.labels」過程。 –

相關問題