2017-02-14 6 views
3

Neo4j CE 3.1.1を使用していますが、著者と書籍の間に関係があります。私は、著者数が最も多いN個(たとえばN = 10)の書籍を探したいと思っています。私が見つけたいくつかの例に続いて、私は、クエリを思い付いた:Neo4j:ほとんどの関係を持つノードとそれらの接続されたノードを見つけるためのクエリ

MATCH (a)-[r:WRITES]->(b) 
RETURN r, 
COUNT(r) ORDER BY COUNT(r) DESC LIMIT 10 

私はのNeo4jブラウザでこのクエリを実行すると、それらが示すように、私は10冊を得るが、これらはほとんどの著者によって書かれたもののようには見えません。著者とのわずかなWRITES関係。クエリを

に変更した場合
MATCH (a)-[r:WRITES]->(b) 
RETURN b, 
COUNT(r) ORDER BY COUNT(r) DESC LIMIT 10 

次に、ほとんどの著者と10冊の本を取得しますが、著者との関係はわかりません。これを行うには、前のクエリで見つかった本の名前を明示する追加のクエリを書く必要があります。

MATCH()-[r:WRITES]->(b) 
WHERE b.title="Title of a book with many authors" 
RETURN r 

私は間違っていますか?最初のクエリが期待どおりに機能しないのはなぜですか?

答えて

3

集約には非集約列に基づくコンテキストしかなく、一致すると一意の関係は結果に1回しか発生しません。

だからあなたの最初のクエリでは、行の各関係を求めている、と1

である特定の関係、のカウントは、あなたはカップルの異なる方法でこれを書き換えるかもしれません。

一つが、著者リストのサイズに著者と秩序を収集することです:

MATCH (a)-[:WRITES]->(b) 
RETURN b, COLLECT(a) as authors 
ORDER BY SIZE(authors) DESC LIMIT 10 

関係自体があなたに興味がある場合は常に、著者との関係を収集することができます。

EDIT

あなたは(あなたは絶対にあなたのノードのラベルを持っている必要があります)あなたのノードのラベルを持って起こる場合は、あなたが入ってくるのサイズを取得し、すべての書籍に一致させることにより、異なるアプローチを試すことができます。関係を書き込みそれぞれの本に、注文とその上の制限、そして作者に試合を実施:

MATCH (b:Book) 
WITH b, SIZE(()-[:WRITES]->(b)) as authorCnt 
ORDER BY authorCnt DESC LIMIT 10 
MATCH (a)-[:WRITES]->(b) 
RETURN b, a 

あなたは著者に収集および/または同様の関係を返すことができます、あなたは出力から必要なものに依存します。

+0

ありがとうございます! – st1led

+0

確かに!最初にクエリをプロファイリングしたいかもしれませんが、私が最初に与えたものは、より大きなグラフ上でたくさんの収集を行うので、おそらくパフォーマーとしてはなりません。 – InverseFalcon

0

あなたは非常に近いです:ソート後、著者を再発見する必要があります。例:

+0

私はこのクエリを試してみました。私は大きなデータを持っていませんが、何とか受け入れられた答えの中の最初のものよりスケーラビリティが低いと感じています(1つのMATCH句と2つだけです)。しかし、私はneo4j内部の動作/最適化の専門家ではなく、これもうまく機能します。 – st1led

+0

@ st1ledクエリを常にPROFILEして、確認することができます。つまり、2番目のMATCHはLIMIT 10の後ろにあるので、最初のものほど重くはないので、実際にはすべて同じようになるはずです。 – InverseFalcon

関連する問題