web-dev-qa-db-ja.com

Neo4j:ほとんどの関係を持つノードとそれらに接続されたノードを見つけるためのクエリ

私はNeo4jCE 3.1.1を使用しており、著者と本の間にWRITESの関係があります。著者数が最も多いN冊(たとえばN = 10)の本を見つけたいと思います。私が見つけたいくつかの例に従って、私はクエリを思いつきました:

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

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

9
st1led

集計には、非集計列に基づくコンテキストのみがあり、一致すると、結果で一意の関係が1回だけ発生します。

したがって、最初のクエリは、行の各関係と、その特定の関係の数(1)を要求することです。

これをいくつかの異なる方法で書き直すことができます。

1つは、著者を収集し、著者リストのサイズで注文することです。

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

関係自体が興味を引く場合は、いつでも作成者とその関係を収集できます。

編集

ノードにラベルがある場合(ノードにラベルを付ける必要があります)、すべての本に一致させ、各本への着信:WRITES関係のサイズを取得し、順序付けして制限することで、別のアプローチを試すことができます。 、次に作成者との一致を実行します。

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

出力から必要なものに応じて、作成者を収集したり、関係を返したりすることもできます。

11
InverseFalcon

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

MATCH (a:Author)-[r:WRITES]->(b:Book)
WITH b, 
     COUNT(r) AS authorsCount
     ORDER BY authorsCount DESC LIMIT 10
MATCH (b)<-[:WRITES]-(a:Author)
RETURN b, 
       COLLECT(a) AS authors
       ORDER BY size(authors) DESC
1
stdob--