首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Neo4j:为什么allShortestPaths函数的性能这么慢?

Neo4j:为什么allShortestPaths函数的性能这么慢?
EN

Stack Overflow用户
提问于 2015-11-07 00:41:37
回答 1查看 313关注 0票数 0

我使用的是Neo4j的新4j社区-2.3.0-RC1‘版本。在我的数据库中,只有1054个节点。当我使用'allShotestPaths‘函数进行路径查询时,为什么它速度这么慢。它需要超过1秒的时间,以下是单元测试结果:

代码语言:javascript
运行
复制
  √ search optimalPath Path (192ms)
  √ search optimal Path by Lat Lng (1131ms)

我应该优化查询吗?以下是关于“optimalPath”和“Lat最佳路径”的查询

optimalPath查询:

代码语言:javascript
运行
复制
MATCH path=allShortestPaths((start:潍坊_STATION )-[rels*..50]->(end:潍坊_STATION {name:"火车站"}))
RETURN NODES(path) AS stations,relationships(path) AS path,length(path) AS stop_count, 
length(FILTER(index IN RANGE(1, length(rels)-1) WHERE (rels[index]).bus <> (rels[index - 1]).bus)) AS transfer_count, 
length(FILTER( rel IN rels WHERE type(rel)="WALK"  )) AS walk_count
order by transfer_count,walk_count,stop_count

Lng查询的最佳路径:

代码语言:javascript
运行
复制
MATCH path=allShortestPaths((start:潍坊_STATION {name:"公交总公司"})-[rels*..50]->(end:潍坊_STATION {name:"火车站"}))
 WHERE
round(
6378.137 *1000*2*
asin(sqrt(
     sin((radians(start.lat)-radians(36.714))/2)^2+cos(radians(start.lat))*cos(radians(36.714))*
     sin((radians(start.lng)-radians(119.1268))/2)^2
 ))
)/1000 < 0.5      // this formula is used to calculate the distance between two GEO  coordinate (latitude\longitude)
RETURN NODES(path) AS stations,relationships(path) AS path,length(path) AS stop_count, 
length(FILTER(index IN RANGE(1, length(rels)-1) WHERE (rels[index]).bus <> (rels[index - 1]).bus)) AS transfer_count, 
length(FILTER( rel IN rels WHERE type(rel)="WALK"  )) AS walk_count
order by transfer_count,walk_count,stop_count

您可以在这里下载数据库:https://www.dropbox.com/s/zamkyh2aaw3voe6/data.rar?dl=0

如果有人能帮我,我会非常感激的。谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-07 01:04:08

通常,在不了解更多信息的情况下,我会在展开路径之前,在匹配之前提取可以计算的谓词和表达式。

而且,由于地理过滤器与除参数和开始节点之外的任何其他内容无关,所以可以:

代码语言:javascript
运行
复制
MATCH (start:潍坊_STATION {name:"公交总公司"})

WHERE 
// this formula is used to calculate the distance between two GEO  coordinate (latitude\longitude)
round(6378.137 *1000*2* 
      asin(sqrt(sin((radians(start.lat)-radians({lat}))/2)^2
      +cos(radians(start.lat))*cos(radians({lat}))*
       sin((radians(start.lng)-radians({lng}))/2)^2)))/1000 
< 0.5      

MATCH (end:潍坊_STATION {name:"火车站"})
MATCH path=allShortestPaths((start)-[rels*..50]->(end))
RETURN NODES(path) AS stations,
       relationships(path) AS path,
       length(path) AS stop_count, 
       length(FILTER(index IN RANGE(1, length(rels)-1) 
             WHERE (rels[index]).bus <> (rels[index - 1]).bus)) AS transfer_count,
       length(FILTER( rel IN rels WHERE type(rel)="WALK"  )) AS walk_count

ORDER BY transfer_count,walk_count,stop_count;

请参阅此测试(但另一个查询同样快速):

代码语言:javascript
运行
复制
neo4j-sh (?)$ MATCH (start:潍坊_STATION {name:"公交总公司"})
> 
> WHERE 
> // this formula is used to calculate the distance between two GEO  coordinate (latitude\longitude)
> round(6378.137 *1000*2* 
>       asin(sqrt(sin((radians(start.lat)-radians({lat}))/2)^2
>       +cos(radians(start.lat))*cos(radians({lat}))*
>        sin((radians(start.lng)-radians({lng}))/2)^2)))/1000 
> < 0.5      
> 
> MATCH (end:潍坊_STATION {name:"火车站"})
> MATCH path=allShortestPaths((start)-[rels*..50]->(end))
> WITH NODES(path) AS stations,
>        relationships(path) AS path,
>        length(path) AS stop_count, 
>        length(FILTER(index IN RANGE(1, length(rels)-1) 
>              WHERE (rels[index]).bus <> (rels[index - 1]).bus)) AS transfer_count,
>        length(FILTER( rel IN rels WHERE type(rel)="WALK"  )) AS walk_count
> 
> ORDER BY transfer_count,walk_count,stop_count
> RETURN count(*);
+----------+
| count(*) |
+----------+
| 320      |
+----------+
1 row
10 ms
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33577798

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档