2017-06-28 20 views
1

ムービーグラフがあります。俳優、監督、映画があります。ディレクターが別の映画や同じ映画でもプレイしている可能性があります。俳優には彼が演じる映画ごとにスコアが与えられます。監督には彼の映画ごとにスコアが与えられます。今、私たちは個人とそのスコアのリストを最高スコアから最低スコアにソートすることを目指しています。したがって、これらは私たちが現在持っているクエリです:複数のNeo4jクエリのスコアを組み合わせる

MATCH (p:Person)-[idr:IsDirectorOf]->(m:Movie)

RETURN p.name AS name, COUNT(idr) AS numberOfMoviesDirected

ORDER BY numberOfMoviesDirected DESC;

MATCH (p:Person)-[iai:IsActorIn]->(m:Movie)

RETURN p.name AS name, COUNT(iai) AS numberOfMoviesPlayed

ORDER BY numberOfMoviesPlayed DESC;

これらのクエリを組み合わせて、両方のクエリの中で最高のスコアを持つ人物を一番上にまとめることができます。また、後で別のクエリをミックスに追加する必要がある可能性があるので、2つのクエリに対してのみ機能するソリューションが最適ではない可能性があります。

答えて

0

あなたはこのクエリ試してみてください:

MATCH (p:Person) 
RETURN p, size((p:Person)-[:IsDirectorOf]->(:Movie)) + size((p:Person)-[:IsActorIn]->(:Movie)) AS score 
ORDER BY score DESC 

をそして、あなたは追加のスコアを追加したい場合は、ちょうどWITHでクエリを続けます。

乾杯

あなたのコメントに対応するためにUPDATE

、これはクエリです:

MATCH (p:Person) 
WITH 
    max(size((p)-[:IsActorIn]->())) As maxActed, 
    max(size((p)-[:IsDirectorOf]->())) AS maxDirected 
MATCH (p:Person) 
RETURN 
    p, 
    size((p)-[:IsActorIn]->(:Movie))/toFloat(maxActed) + size((p)-[:IsDirectorOf]->(:Movie))/toFloat(maxDirected) AS score 
ORDER BY score DESC 
+0

私は '[IDO:IsDirectorOf]書く場合、'、私は 'にido'をしませ得ます定義された。どうして? –

+0

また、各サイズを対応する最大値でグラフ全体に分割する(正規化する)にはどうすればよいですか?サイズ((p:人物 - [:IsDirectorOf] - > :(:ムービー))) 'は動作しませんでした。 –

+0

更新されたクエリを実行すると、 'Neo.ClientError.Statement.ArithmeticError'が'/by zero'を取得します。しかし、最大値はゼロではありません。 –

関連する問題