質問
私は検索をしたいと思います、そして私は2つのラベル(または条件)からトラバースを始めたいと思います。たとえば、'Male'または'Female'のいずれかのラベルを持ち、そのプロパティname=〜'のすべてのノードを見つける必要があります。エイル'.
解決
WHERE
句に配置できます。
MATCH n
WHERE n:Male OR n:Female
RETURN n
.
編集
@TBAUMを指すと、これはAllNodesScan
を実行します。ラベルが公正に新たに新たに新たに新たに新たな答えを書いて、クエリプランナが、単一ラベルケース
NodeByLabelScan
でそれを実装する予定です。
MATCH n
WHERE n:Male
RETURN n
.
私はまだクエリの合理的な表現であり、クエリプランナがラベルスキャンでそれを実装することを期待するのが合理的であると思いますが、Neo4j 2.2.3の時点では、依然としてAllNodesScan
とラベルフィルタが実装されています。 。したがって、これがより詳細な代替案です。ラベル分離はセットUNIONを意味し、この共用体はさまざまな方法で表現できますが、クエリプランナがすべてのノードをスキャンせずに実装し、代わりにラベルごとのNodeByLabelScan
で始まります。
MATCH (n:Male)
WHERE n.name =~ '.ail.'
RETURN n
UNION MATCH (n:Female)
WHERE n.name =~ '.ail.'
RETURN n
.
これは、各ラベルに対して一度クエリを表現し、それらに明示的なUNION
を結合することを意味します。これは、少なくともより少ない数のラベルのために不合理ではありませんが、クエリプランナーがより単純なクエリから同じ実装を推測できないので、github問題こちら
他のヒント
MATCH n WHERE n:Label1 OR n:Label2
.
...これは悪い考えであるallnodesscanになるでしょう!
おそらくより良い解決策:
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)
. NEO4J 3.4.7 Query Plannerは、2つまたは複数のラベルフィルタを使用したWHERE QUERY WHERE QUERYを手渡したときに、クエリプランナーを実行し、次に2つのNodeByLabelScan
sの異なる。 Sandbox Offshore Revsデータベース
V3.0のドキュメントには次のように書かれています:
複数のラベルを持つノードを記述することもできます:
(a:User:Admin)-->(b)
ソース: https://neo4j.com/docs/developer-manual/current/cypher/#_labels