2017-02-05 8 views
0

特定のラベルタイプのすべてのノードを取得しようとしています。私はそれらのラベルにすべて同じサフィックスを持つ複数のグラフのルーツを持っています。たとえば、私は3つのノードがすべてラベルの末尾にtreerootを持っています。だから、私はcompanytreerootbuildingtreeroot、nd employeetreerootを3つの別個のノードに対して3つの有効なラベルとして持つかもしれません。どのようにラベルにそのパターンがあるすべてのノードを取得できますか?neo4jにstringを含むすべてのラベルを見つける方法

は、私が試した:

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

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

が、両方が空のセットを返す...

+0

わからない場合は、しかし、ノードは、マルチ標識することができます。これが空文字列マッチングではなく、一度に複数の類似ラベルにまたがってノードを取得する必要がある場合は、これらのノードにスーパーラベルとしてラベルを追加することを検討してください。 treerootラベル(companytreeroot、buildingtreeroot、employeetreeroot)を持つすべてのノードに:TreeRootラベルを追加し、TreeRootをこれらのラベルの新しいノードに追加するようにします。そうすれば、グラフスキャン全体を実行するよりも効率的にクエリを実行できます。 – InverseFalcon

+0

これらの一致は完全な文字列をチェックするだけです。 @ InverseFalconの答えが最も効率的です。 1。 –

答えて

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"という手続きを指摘してくれてありがとう。 –

関連する問題