cypher中的嵌套MATCH语句

时间:2016-10-09 14:28:15

标签: neo4j cypher

(client)-[:listens]->(album)-[:contains]->(song)是我的关系。我需要找到有多少不同的歌曲和客户听过哪首歌已经听过ID为4的歌曲(f.e。)。

在SQL中,我可以通过双嵌套JOINSELECT轻松实现这一点,但由于我是Cypher的新手,我有点迷茫。方案如下:

  1. 查找哪些客户(他们的ID)已收听ID为4的歌曲
  2. 从上一步中找到的客户获取所有已收听的歌曲,并将其返回(以及他们的计数)。
  3. 我试着像smth一样开始:

    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 (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
    

    显然不起作用。

    我无法绕过将clientsIDs传递给另一个MATCH声明的部分......

1 个答案:

答案 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
相关问题