我正在尝试构建一个按http://static.echonest.com/BoilTheFrog/行工作的数据库,您可以在其中输入2位艺术家,并获得一系列可在它们之间无缝转换的曲目。
我建立了一个Neo4j数据库,拥有大约10万相互关联的艺术家。 artists及其relationships彼此之间取自Spotify Web API。 每位艺术家都有一个受欢迎程度值(0到100之间)。 我想在两位艺术家之间找到一条至少20个连接长的路径,其中路径上的所有艺术家都具有最低的受欢迎程度。 这就是我到目前为止所做的事情,它在我的头脑中是有道理的,但它只是无限地运行而且永远不会完成。
MATCH (start:Artist {name: 'Ed Sheeran'}), (end:Artist {name: 'The Strokes'})
MATCH path = shortestPath((start)-[:`HAS SIMILAR ARTIST`*..20]-(end))
WHERE ALL(x in nodes(path) WHERE x.popularity > 20)
AND LENGTH(path) = 20
RETURN path
LIMIT 1
我的猜测是 MATCH路径= .. 每次都找到相同的路径,然后应用 WHERE 过滤器,因此它永远不会成功。 我已经看到了基于关系本身进行过滤的方法,但我想要过滤的属性在节点本身上。
如果我改为使用
MATCH (start:Artist {name: 'Ed Sheeran'}), (end:Artist {name: 'The Strokes'})
MATCH path = shortestPath((start)-[:`HAS SIMILAR ARTIST`*..20]-(end))
WHERE LENGTH(path) = 20
RETURN path
LIMIT 1
它成功了,但有些联系非常模糊,所以我希望加强与人气要求的关系。
答案 0 :(得分:1)
由于您只需要长度为20的路径,因此应将20指定为可变长度路径模式的下限(以及上限)。这应该消除(或大大减少)重复遍历较短路径的次数。
MATCH (start:Artist {name: 'Ed Sheeran'}), (end:Artist {name: 'The Strokes'})
MATCH path = shortestPath((start)-[:`HAS SIMILAR ARTIST`*20..20]-(end))
WHERE ALL(x in nodes(path) WHERE x.popularity > 20)
RETURN path
LIMIT 1;