質問

私は検索をしたいと思います、そして私は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つのNodeByLabelScansの異なる。 Sandbox Offshore Revsデータベース

 NEO4Jクエリ計画

V3.0のドキュメントには次のように書かれています:

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

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

ソース: https://neo4j.com/docs/developer-manual/current/cypher/#_labels

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top