2013-11-15 23 views
29

検索を行いたいので、2つのラベル(OR条件)からトラバースを開始したいと考えています。たとえば、「Male」または「Female」のラベルを持ち、プロパティがname =〜 'であるすべてのノードを見つける必要があります。 ail。 '。Neo4j:複数のラベルに一致する(2以上)

答えて

29

あなたはWHERE句でそれを置くことができます:@tbaumこれはAllNodesScanを行い指摘するように

MATCH n 
WHERE n:Male OR n:Female 
RETURN n 

EDIT

。私はラベルがかなり新しいだったときの答えを書き、それが単一ラベルケース

MATCH n 
WHERE n:Male 
RETURN n 

の場合と同様に、クエリプランナは、最終的に私はまだ、これは合理的な表現だと思う、各ラベルについてNodeByLabelScanでそれを実装すると予想しましたクエリープランナーがラベルスキャンでそれを実装することを期待するのは妥当であるが、Neo4j 2.2.3ではクエリーはまだAllNodesScanとラベルフィルターで実装されています。したがって、より冗長な選択肢があります。ラベル結合は集合体を意味し、この結合体はさまざまな方法で表現できるため、クエリプランナがすべてのノードをスキャンせずに実装し、ラベルごとにNodeByLabelScanで始まるように表現できます。

MATCH (n:Male) 
WHERE n.name =~ '.ail.' 
RETURN n 
UNION MATCH (n:Female) 
WHERE n.name =~ '.ail.' 
RETURN n 

これは、各ラベルに一度クエリを表現し、明示的なUNIONとそれらを結ぶことを意味します。これは少なくともラベルの数が少なくても不合理ではありませんが、クエリープランナーがより単純なクエリから同じ実装を推論できないようにすべき理由はわかりません。hereを開いています。

+8

これを行うための方法はありますか?例えば、関係のために '(n) - [:rel1 | rel2] - >(m) 'どこで' | 'は' OR'を示します –

+0

いいえ、あなたはそのパターンをラベルに使うことはできません。もっと短いパターンや 'WHERE'句なしで動作するパターンは認識していません。 Neo4j [githubリポジトリ](https://github.com/neo4j/neo4j/issues)で機能リクエストを送信してください。 – jjaderberg

+0

@Lyman Zerga私はまた、多くの場所で検索しましたが、そのようなものはありません –

9
MATCH n WHERE n:Label1 OR n:Label2 

...これは、悪い考えであるAllNodesScanになります!

多分よりよい解決策:v3.0のための

OPTIONAL MATCH (n1:Label1) 
WITH collect(distinct n1) as c1 

OPTIONAL MATCH (n2:Label2) 
WITH collect(distinct n2) + c1 as c2 

OPTIONAL MATCH (n3:Label3) 
WITH collect(distinct n3) + c2 as c3 

UNWIND c3 as nodes 
RETURN count(nodes),labels(nodes) 
+1

なぜ、それぞれのステップで "別個"が必要ですか? –

+0

'AllNodesScan'を指摘してくれてありがとう、私は今それが解決されていると思った。私は自分の答えを更新しました。あなたは 'UNION 'を使って私のより冗長な選択肢について、そしてあなたの' OPTIONAL MATCH'/'collect()'/'UNWIND'とどのように比較するかについて考えていますか? – jjaderberg

+1

1つの注記:UNIONは、現時点では(2つの理由で)不便です(場合によっては使用できません)。2)UNIONの結果を処理することはできません。たとえば、SKIP/LIMITまたはCOUNTは使用できません。 –

-2

ドキュメントはこのことを言う:

一つでも複数のラベルを持つノード記述することができます。

(a:User:Admin)-->(b)

出典:https://neo4j.com/docs/developer-manual/current/cypher/#_labels

+0

答えは正確ではありませんが、完全に悪くないわけではありません。著者は質問に関係を含めるのを忘れてしまいましたが、複数のノードラベルを照合する目的で動作します: 'MATCH(a:User:Admin) r]→(b)return a、r、b' – artemisian

+0

FYI。ソースURLが少し変更されました。これは新しいものです:https://neo4j.com/docs/developer-manual/current/cypher/syntax/patterns/#_labels – Chad

+10

実際には、これは間違っています(a:User:Admin)。このクエリは、ノード"ユーザーと管理者"です。ユーザーまたは管理者はいません。 –

関連する問題