(client)-[:listens]->(album)-[:contains]->(song)
是我的关系。我需要找到有多少不同的歌曲和客户听过哪首歌已经听过ID为4的歌曲(f.e。)。
在SQL中,我可以通过双嵌套JOIN
和SELECT
轻松实现这一点,但由于我是Cypher
的新手,我有点迷茫。方案如下:
我试着像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
声明的部分......
答案 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