【发布时间】:2015-04-08 17:28:19
【问题描述】:
我在一台有 12 个处理器和 64GB 内存的 Windows 机器上安装了 Neo4j。我没有更改 Neo4j 允许的任何内存设置。
我的数据库有 380 万个节点,其中 210,000 个被标记为地理标记,总共有 650,000 个关系。我正在尝试运行以下查询,我想知道这是否是一个非常密集的查询,可能需要很长时间。
Messages.csv 是我的关系文件。已经创建了关系,但是由于我不知道如何将关系创建与下面的距离生成相结合,我正在加载并运行两次关系文件。
USING PERIODIC COMMIT 15000
LOAD CSV WITH HEADERS FROM "file:d:/messages.csv" AS line
MATCH (a:Geotagged { username: line.sender }) - [r:MSGED] -> (b:Geotagged { username: line.recipient })
SET r.Distance = (2 * 6371 * asin(sqrt(haversin(radians(toFloat(b.statusLat) - toFloat(a.statusLat))) + cos(radians(toFloat(b.statusLat))) * cos(radians(toFloat(a.statusLat))) * haversin(radians(toFloat(b.statusLon) - toFloat(a.statusLon))))));
初始关系生成大约需要 3-5 分钟。我让上面的运行了一个多小时,它仍然没有完成。我在同一个初始数据库上运行了一个类似的算法(尽管它有更多的触发调用),让它运行了 18 多个小时,但仍未完成。
我的问题:这是一个非常密集的查询吗?我没有给它足够的时间吗?更重要的是,有什么方法可以优化它吗?
我尝试添加“WHERE NOT HAS(r.Distance)”以排除算法已经设置了距离的节点对,但我不确定 MATCH 是一次性匹配还是每个匹配CSV 文件中的行?
对此的任何想法将不胜感激。
【问题讨论】: