2014-03-30 39 views
1

我是Neo4j的新手,发现查询时间与MySQL相比相当高。开箱即用的Neo4j社区版在Windows上的性能

在演示文稿中,我听到大约2ms的查询时间,但即使对于来自Movie Graph教程的最简单查询,我也得到80 ms。 对于其他(非常小)的数据集,我会在150-250 ms附近得到查询时间。

如何使用Neo4j获得更好的性能?

我正在使用Neo4j服务器2.0.1社区版8GB RAM,SSD,i5的Windows 8笔记本电脑上的二进制格式(zip)稳定版本。查询从浏览器界面执行。在MySQL(InnoDB的)

MATCH (tom {name: "Tom Hanks"}) RETURN tom 
Returned 1 row in 189 ms 

MATCH (tom {name: "Tom Hanks"}) RETURN tom 
Returned 1 row in 79 ms 

类似的查询是围绕4毫秒:

SET PROFILING=1; 
SELECT * FROM person WHERE name = "Tom Hanks"; 
SHOW PROFILES; 

+----------+------------+-----------------------------------------------+ 
| Query_ID | Duration | Query           | 
+----------+------------+-----------------------------------------------+ 
|  1 | 0.00369300 | SELECT * FROM person WHERE name = "Tom Hanks" | 
+----------+------------+-----------------------------------------------+ 
1 row in set (0.00 sec) 

执行Neo4j.bat当我得到一个启动错误(例外)。这可能是问题吗?

Can't load log handler "java.util.logging.FileHandler" 
java.io.IOException: Couldn't get lock for data/log/neo4j.%u.%g.log 
+0

正如迈克尔在他的回答中提到的,你应该使用索引和标签。我只是想澄清一下,你在MySQL中的*类似查询并不是真的类似。用你的MySQL查询,你只打到一个'Person'表,只有'Person'实体。用你当前的Neo4j查询,你正在筛选所有*节点(比'Person's数量多得多的节点。 –

+0

你是对的,我的不好,我的意图是用标签'(tom:Person)查询。 ..)'。查询时间然后下降到65毫秒 – oliverdm

回答

2

你可能想为

create index on :Person(name); 

创建索引,并使用这样的查询:

MATCH (tom:Person {name: "Tom Hanks"}) RETURN tom 

请注意,浏览器的措施不仅仅是有查询更多额外往返载入可视化数据和其他信息。

对我来说,以导致浏览器:

Returned 1 row in 38 ms 

如果我在我的机器上执行查询,但使用的Neo4j壳(也可以用http://localhost:7474/webadmin访问它的网络版)我得到:

$ match (n:Person {name:"Tom Hanks"}) return n; 
==> +--------------------------------------+ 
==> | n         | 
==> +--------------------------------------+ 
==> | Node[71]{name:"Tom Hanks",born:1956} | 
==> +--------------------------------------+ 
==> 1 row 
==> 1 ms 
+0

谢谢! 没有索引查询需要20-30ms在Web控制台(首次执行总是需要很长的时间虽然);与索引它需要1-4ms 但是,在命令行shell中,由于某些原因,查询速度似乎较慢(15-20毫秒)。 – oliverdm

+0

由于shell使用RMI与服务器进行通信,可能会涉及更多的往返操作。 –