2016-05-03 16 views
0

グラフがあります:(:Sector)<-[:BELONGS_TO]-(:Company)-[:PRODUCE]->(:Product)です。トラバーサルブランチの最初のn個のノードに一致するNeo4j/Cypher

私は以下の質問を探しています。

(:Sector)で始まります。その後、その部門の最初の50社と一致し、各企業は最初の10製品と一致します。

初回限定は簡単です。しかし、製品を制限することはどうか。

サイファーで可能ですか?

UPDATE

@cybersamは、それはまだ、会社ごとにすべての製品を横断するときに、このソリューションは拡張できません。ただし、有効な結果

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company) 
WITH c 
LIMIT 50 
MATCH (c)-[:PRODUCE]->(p:Product) 
WITH c, (COLLECT(p))[0..10] AS products 
RETURN c, products 

を返しますクエリの下に示唆したように。スライスは、各社の製品が収集された後に適用されます。製品の数が増えると、クエリのパフォーマンスが低下します。

答えて

1

このクエリの各返された行が含まれます:部門、その企業(セクタあたり最大で50)の一つであり、その会社のために最大10製品の回収:一部で

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company) 
WITH s, (COLLECT(c))[0..50] AS companies 
UNWIND companies AS company 
MATCH (company)-[:PRODUCE]->(p:Product) 
WITH s, company, (COLLECT(p))[0..10] AS products; 
+1

歓声@cybersam。このクエリは機能します。企業あたりの製品数が増えるとどのように拡張されるのでしょうか?あなたはまだすべての製品にマッチし、それらをグループ化し、後に制限します。私はあなたが特定の数のノードに合ったときにマッチングを止めることができるかどうかに関心がありました。 – drgraduss

+0

それはすばらしい質問です。残念ながら、私は 'LIMIT'を使う方法がないので、会社ごとの製品を制限するだけです。 – cybersam

+0

大丈夫です。トラバーサルフレームワークAPIが私にとっての答えだと思われます。私はスケーラビリティについての解答を受け付けます。あなたの助けを感謝@cybersam。 – drgraduss

1

の更新をAPOC Proceduresを使用して解決します。

このNeo4jナレッジベースのlimiting results per rowには、これを行う方法がいくつか記載されています。

1つの方法として、apoc.cypher.run()を使用して、行ごとに限定された副問合せを実行します。問題のクエリに適用され、これは動作します:

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company) 
WITH c 
LIMIT 50 
CALL apoc.cypher.run('MATCH (c)-[:PRODUCE]->(p:Product) WITH p LIMIT 10 RETURN collect(p) as products', {c:c}) YIELD value 
RETURN c, value.products AS products 

終了フィルタと制限のラベルを提供し、APOCパスエキスパンダの手順を使用している言及した他の代替:

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company) 
WITH c 
LIMIT 50 
CALL apoc.path.subgraphNodes(c, {maxLevel:1, relationshipFilter:'PRODUCE>', labelFilter:'/Product', limit:10}) YIELD node 
RETURN c, collect(node) AS products 
関連する問題