Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j在每个节点上使用过滤器查找最短路径_Neo4j_Cypher - Fatal编程技术网

Neo4j在每个节点上使用过滤器查找最短路径

Neo4j在每个节点上使用过滤器查找最短路径,neo4j,cypher,Neo4j,Cypher,我正试图建立一个数据库,它的工作原理是输入两个艺术家,然后得到一个曲目列表,在他们之间无缝过渡 我已经建立了一个Neo4j数据库,拥有大约10万名相互关联的艺术家。它们之间的相互关系是从Spotify Web API中获取的。 每个艺术家都有一个流行度值(介于0和100之间)。 我想在两位艺术家之间找到一条至少有20条连接的路径,在这条路径上所有的艺术家都有最低的人气。 这是我到目前为止所做的,在我的头脑中是有道理的,但它只是无限地运行,永远不会结束 MATCH (start:Artist {n

我正试图建立一个数据库,它的工作原理是输入两个艺术家,然后得到一个曲目列表,在他们之间无缝过渡

我已经建立了一个Neo4j数据库,拥有大约10万名相互关联的艺术家。它们之间的相互关系是从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
我的猜测是,匹配路径=…每次都会找到相同的路径,然后应用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

它成功了,但有些连接非常模糊,因此我希望加强与流行性要求的关系。

因为您只希望路径长度正好为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;

对于这种工作负载,Cypher通常不能提供理想的解决方案。您最好使用提供的。您不能使用最短路径指定最小值