Performance 在查询任意两个节点之间的路径时,如何避免笛卡尔积?

Performance 在查询任意两个节点之间的路径时,如何避免笛卡尔积?,performance,neo4j,cypher,cartesian,Performance,Neo4j,Cypher,Cartesian,我的图中有两种类型的节点。70k文章、10k医生和20K节点之间的关系。我想查询图中所有的最短路径,然后过滤最长的2条路径。但是查询计划中有笛卡尔积,性能太低……我的cypher查询如下: Match p = shortestPath( (a:DOCTOR)-[n:IS_AUTHOR*1..]-(b:DOCTOR) ) with a,b,p,length(p) AS length order by length(p) DESC limit 3 RETURN nodes(p) 在使用全局图查询时

我的图中有两种类型的节点。70k文章、10k医生和20K节点之间的关系。我想查询图中所有的最短路径,然后过滤最长的2条路径。但是查询计划中有笛卡尔积,性能太低……我的cypher查询如下:

Match p = shortestPath( (a:DOCTOR)-[n:IS_AUTHOR*1..]-(b:DOCTOR) )
with a,b,p,length(p) AS length
order by length(p) DESC limit 3
RETURN nodes(p)

在使用全局图查询时,我可以做些什么来调整性能?这是我的查询计划:

你能澄清一下你想做什么吗?查询是使用给定的路径类型在每个医生组合之间查找最短路径。这是你想要的吗?如果是这样,我不认为你可以避免笛卡尔积。但是,如果你想为每个医生找到一条最短的路径,找到这条路径上最近的医生,然后试图找到其他医生的最长路径,那是一个完全不同的查询……我认为这不是一个你可以用最短路径函数实现的查询。