2015-01-12 51 views
0

我是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

也许你可以尝试使用系统的一个子集来查看执行计划花费的最多时间。

你可以在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) 
+0

我跑的命令(不带配置文件,因为它didn't工作),这里是结果: 计数(DIST)套装1716点的特性,创造了1716间的关系,在4816毫秒 –

+0

通过返回1行的我的计算,对于整个19800系统,它应该总共需要110分钟,但2-3小时后,它没有完成:( –

+0

它没有工作,因为你没有在壳中运行它 –

0

由于它具有复杂度O(N * N),所以查询需要很长时间并不奇怪。索引不起作用,因为您不使用特定的属性值进行匹配。

我建议您计算Cypher的以外的程序编程的距离,然后使用Cypher创建关系。这仍然会很慢,但可能比试图在Cypher中做所有事情要快得多。

此外,通过注意[系统A到系统B的距离]等于[系统B到系统A的距离],您可以减少需要执行的计算次数。您只需要在任何两个系统之间创建单个距离关系。

最后,以确定您的数据库显然伪关系,你可以尝试这样的事情查询来看看其中的一些:

MATCH()-[r]->() 
RETURN r 
LIMIT 50 

如果你是真的真的确定你想要得到摆脱所有关系,您可以使用以下查询。为了安全起见,您可能需要首先制作数据库的备份副本(关闭数据库服务器,制作其data/graph.db/文件夹的递归副本,然后重新启动服务器)。

MATCH()-[r]->() 
DELETE r 
+0

谢谢你的回答。当我使用Cypher查询时,关系不存在(MATCH() - [r :: IS_DISTANCED_FROM] - >()),但在neo4j Dashboard中,现在有809 517个关系...我很确定600 000这些不应该存在。无论如何,我可以刷新数据库的缓存? –

+0

如何在两个系统之间创建单个距离关系?我认为CREATE UNIQUE可以达到这个目的吗? –

+0

您不应该使用关系类型限定您的查询。也就是说,使用'[r]'而不是'[r:IS_DISTANCED_FROM]'。你的数据库显然有很多其他类型的关系。 – cybersam

相关问题