2016-10-09 1 views
0

(client)-[:listens]->(album)-[:contains]->(song)は私の関係です。どのくらいの数の異なる曲がクライアントによって聴かれているかをID 4(f.e.)の曲で聴いたことが分かります。サイファーのネストされたMATCH文

SQLでは、ダブルネストされたJOINSELECTで簡単に達成できましたが、私はCypherの初心者ですから、ちょっと迷っています。シナリオは以下の通りである。

  1. ID 4
  2. 前のステップで見つかったクライアントからのを聞いてきたすべての曲を、入手して、曲を聴いているクライアント(そのID)の検索、およびそれらを返します(およびそれらの数も同様)。

は、私は次のようになめらかで始めてみました:

明らかに動作しませんでした
MATCH (c:Client)--(a:Album)--(s:Song) 
WHERE s.songID = "4" 
WITH a, s, {cID: c.clientID} AS clientsIDs 
MATCH (c {clientID: clientsIDs})-[:LISTENS]->(a)-[:CONTAINS]->(s) 
WITH COUNT(s) AS songsCount, COLLECT(s) as songs 
RETURN songs, songsCount 

MATCH (c:Client)--(a:Album)--(s:Song) 
WITH a, s, {cIDs: c.clientID} AS clientsIDs 
// MATCH that gets all songs in albums listened by clients WHERE c.clientID IN clientsIDs -- how to make that? 
WITH COUNT(s), COLLECT(s) as songs 
WHERE s.songID = "4" 
RETURN songs 

これは、別の試みでした。

私はちょうど私があなたが物事を過度に複雑かもしれないと思う...私は別のMATCHステートメントにclientsIDsを渡す部分の周り

+0

は、あなたのsongIDプロパティがintまたは文字列として書かれていますか?それが文字列でない場合、これらの引用符は0の一致となります。 –

答えて

1

を取得することはできません。ここに私の努力があります...

// find all of the clients that have listed to the song with id =4 
MATCH (c:Client)--(a:Album)--(s:Song) 
WHERE s.songID = "4" 

// then with those clients find all of the songs they have listened to 
WITH c 
MATCH (c)-[:LISTENS]->(a)-[:CONTAINS]->(s) 
WITH COLLECT(s) as songs 
RETURN songs, size(songs) as songsCount 
+0

これは空のリストを返します。私の最後の提案として試してみましょう。 – Milkncookiez

+0

代表的なサンプルデータがありますか? –

+0

どういう意味ですか? – Milkncookiez

関連する問題