2017-03-07 9 views
1

ラベルAのノードは100、ラベルBのノードは2つあります。ラベルAを持つすべてのノードは、ラベルBのノードを少なくとも1つ持っています。ラベルAの両方のノードに関連するラベルA?これは私だけこれら二つのノードのいずれかに関連するすべてのノードを与える2つの特定のノードに関連するすべてのノードに一致

MATCH p=(:A)-[:TYPE]->(b:B) where b.Name = 'XYZ' or b.Name = 'ABC' 
RETURN p 

:私は、次の方法を試してみました。

編集:私は、次のクエリを使用してこれを行うことができた:

MATCH (a:A)- [:TYPE] ->(t:Type) where t.Name = 'ABC' 
MATCH (a:A)- [:TYPE] -> (u:Type) where u.Name = 'XYZ' 
return a, t, u 

はこれを最適化する方法はありますか?

答えて

2

これを行うにはいくつかの方法があります。

:TYPE関係の場合:AノードのみがBノードに接続し、それぞれ:Aノードと:Bノードの間にTYPE関係が1つしかない場合、最も速い方法は次の程度に基づいてフィルタリングすることです。 TYPE関係:Aノード:

MATCH (a:A) 
WHERE SIZE((a)-[:TYPE]->()) = 2 
RETURN a 

:TYPE関係がBノード以上になる場合、クエリをわずかに変更できます。それは非常に効率的ではありませんが、それは正常に動作します:

MATCH (a:A) 
WHERE SIZE((a)-[:TYPE]->(:B)) = 2 
RETURN a 

の数場合:Bが増加するノード、そしてあなたが探したい:すべてに接続するノード:Bノード、そして私達ができますノード:使用のコレクションだけでなく、ALL()関数は、の右のセットを取得する

MATCH (b:B) 
WITH COLLECT(b) as bnodes 
MATCH (a:A) 
WHERE ALL(b in bnodes WHERE (b)<-[:TYPE]-(a)) 
RETURN a 

をそしてあなただけのサブセットが必要な場合:代わりに、すべてのBノードを、あなたはあなたの最初の試合をフィルタリングすることができますidsのコレクションに基づいて:

// assuming you supply a list parameter of ids called 'ids' 
MATCH (b:B) 
WHERE b.id in {ids} 
WITH COLLECT(b) as bnodes 
WITH HEAD(bnodes) as first, bnodes 
MATCH (a)-[:TYPE]->(first) 
WHERE ALL(b in TAIL(bnodes) WHERE (b)<-[:TYPE]-(a)) 
RETURN a 

あなたのbノードの要素の1つのタイプであるノードだけを考慮する余分なロジックがあります。そうすることで、私たちは決して考慮しません。ノードがあなたのノードのどれにも関係しないので、不要な比較を実行できなくなります。

+0

これは私の望むもの以上の素晴らしい応答です。ありがとうございました! – lordingtar

+0

あなたがこれらの他の状況に遭遇した場合、それが役立つことを願っています! – InverseFalcon

0

これを試してください。

MATCH (a:A)-[:TYPE]->(b:B) where b.Name = 'XYZ' 
MATCH (a)-[:TYPE]->(b1:b) where b1.Name = 'ABC' 
RETURN a 

2つの異なる名前であるノードでフィルタリングは動作しませんので、あなたは、ここでは単一MATCHのクエリを持つことはできません。また、エンティティの例に(a:A)の変数を割り当てて、それらを返すか、または好きなだけ操作を行うことができます。

関連する問題