2017-03-22 3 views
1

この場合を想定してみましょう。 ノードが少なく(Bigとラベル付けされている)、それぞれ単純な整数IDプロパティを持っています。 各Bigノードは、数百万の(Smallというラベルが付けられた)ノードとの関係を持ちます。 など:異なるノードラベルのサブセットを得るためのCypherクエリ

(小) - [:BELONGS_TO] - :

For each Big node in the range of ids between 4-7, get me 10 of Small nodes that belongs to it.

なっ結果>(ビッグ)

にはどうすればいいフレーズサイファー問合せは、自然言語で次のように表現することができます

:2つのビッグノード、20個の小規模ノード、及び20人の関係

必要結果をこのグラフによって表されることになるを与えます

私が試みたが失敗したもの(それは1つのだけ大きいノードを示す(その関連小ノード10と一緒にID = 5)が、第2のノードを示していない(ID = 6):

MATCH (s:Small)-[:BELONGS_TO]->(b:Big) 
Where 4<b.bigID<7 
return b,s limit 10 

もっと複雑な複合クエリが必要だと思います。

希望私は理解できる方法で私の質問を語ることができます!

答えて

0

制限が以前のフロー全体に適用されるため、クエリが機能しません。

あなたはaggregation function collectを使用する必要があります。

MATCH (s:Small)-[:BELONGS_TO]->(b:Big) Where 4<b.bigID<7 
With b, 
    collect(distinct s)[..10] as smalls 
return b, 
     smalls 
+0

実行結果のみ1ビッグノードと10スモール。 – assem

+0

この動作のデータ例を示します。 –

+0

私は、クエリをテストした私の悪い、異なったデータモデルでした。あなたのクエリ@ stdob--必要に応じて結果! – assem

1

stdob--が言うように、それは結果セット全体を制限して、あなたは、少なくともではない、このように、ここでの制限を使用することはできません。

アグリゲーションソリューションでは正しい回答が返ってきますが、何百万というノードに拡張するためのコストを支払うことになります。あなたは、それぞれの最初の10個をゆっくりと得るソリューションが必要です。

APOCプロシージャを使用すると、apoc.cypher.run()を使用して効果的にサブクエリを実行できます。クエリは行ごとに実行されるため、最初に行を制限すると、これを呼び出してサブクエリ内でLIMITを使用すると、行ごとに10個の結果に制限され、遅延がゆるやかに拡大されるため、数百万のノードに

MATCH (b:Big) 
WHERE 4 < b.bigID < 7 
CALL apoc.cypher.run(' 
MATCH (s:Small)-[:BELONGS_TO]->(b) 
RETURN s LIMIT 10', 
{b:b}) YIELD value 
RETURN b, value.s 
+0

クエリの実行でエラーが発生しました: "このデータベースインスタンスに登録された名前' apoc.cypher.run'のプロシージャはありません。プロシージャ名のスペルが正しくあり、プロシージャが正しく展開されていることを確認してください。 。 私はneo4j ceを使用していますのでご注意ください。3.1.1 – assem

+0

[APOC Procedures plugin](https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases)をインストールする必要があります。バージョン3.1.0.4は、現時点でNeo4j 3.1.1に対応している最新バージョンです。利用可能なすべての手順と機能の[documentation](https://neo4j-contrib.github.io/neo4j-apoc-procedures/)です。 – InverseFalcon

関連する問題