我是Neo4j的新手,我在游戏中使用了一些关于太阳系的数据(称为Elite Dangerous)。作为交易者,您希望根据特定条件找到最有利可图的路线。其中之一是系统与另一个之间所需的跳跃次数。为了计算这一点,我们首先需要为每个系统计算30Ly内所有系统之间的距离,因此我设计了这个查询来计算相关距离:
MATCH (s1:System), (s2:System)
WITH s1, s2, (sqrt((s2.x-s1.x)^2+(s2.y-s1.y)^2+(s2.z-s1.z)^2)) AS dist
WHERE dist < 30 AND dist > 0
CREATE UNIQUE (s1)-[:IS_DISTANCED_FROM {distance: dist}]-(s2)
RETURN count(dist)
系统为x,y,z坐标。查询速度很慢,即使在一小时后,它也没有完成。我做错了吗?
我是系统的索引,我使用的是2.1.6版。
我的密码查询失败但我的数据库现在处于806 777关系。有没有办法清理它,因为我之后查询它们时关系不会出现。
感谢您的帮助!
答案 0 :(得分:0)
也许您可以尝试使用系统的一个子集,以查看执行计划花费最多时间的位置。
你能在neo4j shell中运行这个查询并发布Exectution的结果吗? :
PROFILE MATCH (s1:System)
WITH s1
LIMIT 15
MATCH (s2:System)
WHERE s2 <> s1
WITH s1, s2, (sqrt((s2.x-s1.x)^2+(s2.y-s1.y)^2+(s2.z-s1.z)^2)) AS dist
WHERE dist < 30 AND dist > 0
CREATE UNIQUE (s1)-[:IS_DISTANCED_FROM {distance: dist}]-(s2)
RETURN count(dist)
答案 1 :(得分:0)
您的查询花费很长时间并不奇怪,因为它具有复杂度O(N * N)。索引没有帮助,因为您没有使用特定的属性值进行匹配。
我建议您以编程方式计算Cypher的外距离,然后使用Cypher创建关系。这仍然很慢,但可能比尝试在Cypher中做所有事情要快得多。
此外,通过注意[从系统A到系统B的距离]等于[从系统B到系统A的距离],您可以将需要执行的计算次数减半。您只需要在任何2个系统之间创建单个距离关系。
最后,为了识别数据库中明显虚假的关系,您可以尝试使用此查询来查看其中的一些:
MATCH ()-[r]->()
RETURN r
LIMIT 50
如果您真的想要摆脱所有关系,可以使用以下查询。为安全起见,您可能需要首先制作数据库的备份副本(关闭数据库服务器,制作其data/graph.db/
文件夹的递归副本,然后重新启动服务器。)
MATCH ()-[r]->()
DELETE r