2017-05-05 12 views
0

関係に基づいてノードとそれに関連するすべてのノードを返す必要があります。自分自身で「n」のノードを取得するために、より効率的で、その後、別の呼び出しでのパスを取得する、または私はcallthat戻り「N」を実行すべきだろうNeo4jの結果を得る最も効率的な方法

MATCH (n) where id(n)= {neo_id} 
OPTIONAL MATCH p=(n)-[:OWNS]->(q) 

:クエリの例は次のようになりますと 'p'。

Addt。情報:私は複数の関係のためにこれを行う必要があり、私は関係を追加するたびに、すべてのパス間の組み合わせがパフォーマンスを悪化させることに気付きました。例:

MATCH (n) where id(n)= {neo_id} 
OPTIONAL MATCH p=(n)-[:OWNS]->(q:Something) 
OPTIONAL MATCH o=(n)-[:USES]->(r:SomethingElse) 
. 
. 
. 
OPTIONAL MATCH l=(n)-[:LOCATED_IN]->(r:NthSomethingElse) 
RETURN n, p, o,..., l 

または

//Call 1 
MATCH (n) where id(n)= {neo_id} 
RETURN n 

//Call 2 
MATCH (n) where id(n)= {neo_id} 
OPTIONAL MATCH p=(n)-[:OWNS]->(q:Something) 
RETURN p 

//Call 3 
MATCH (n) where id(n)= {neo_id} 
OPTIONAL MATCH o=(n)-[:USES]->(r:SomethingElse) 
RETURN o 
. 
. 
. 
//Call nth 
MATCH (n) where id(n)= {neo_id} 
OPTIONAL MATCH l=(n)-[:LOCATED_IN]->(r:NthSomethingElse) 
RETURN l 

答えて

2

あなたは常に(それが存在する場合)nを取得したい場合は、それは何の関係を持っていない場合でも、その後、あなたの最初のクエリが実際にそれを行うための唯一の方法です。あなたがそれを望まないなら、2つの節を1に組み合わせることは、おそらくパフォーマンスにほとんど影響を与えません。

MATCH」を追加するたびにスローダウンが発生する理由は、「デカルト製品」のためです。すなわち、MATCHまたはOPTIONAL MATCH節がN行のデータを「通常」生成するが、同じクエリの前の節がすでにM行のデータを生成していた場合、実際の結果の行数はM * Nになります。したがって、すべての余分のMATCHは、データ行の数に乗法的な影響を与えます。

あなたのユースケースによっては、Nを1(またはその他の小さい数字)に変えることができるMATCH節すべての結果に集計を使用してデカルトを回避できます。たとえば、

MATCH (n) where id(n)= {neo_id} 
OPTIONAL MATCH p=(n)-[:OWNS]->(:Something) 
WITH n, COLLECT(p) AS owns 
OPTIONAL MATCH o=(n)-[:USES]->(:SomethingElse) 
WITH n, owns, COLLECT(o) AS uses 
OPTIONAL MATCH l=(n)-[:LOCATED_IN]->(:NthSomethingElse) 
WITH n, owns, uses, COLLECT(l) AS located_in 
RETURN n, owns, uses, located_in; 
+0

完璧!それは多くの意味があります。 –

関連する問題