为什么简单的Cypher查询如此之慢?

时间:2015-11-26 15:51:37

标签: java eclipse neo4j cypher

将Neo4j 2.3.0社区版与Oracle JDK 8和Windows 7一起使用

我是Neo4j的新手,只是尝试使用Java。在Neo4j浏览器中,我使用以下语句创建了3个节点:

CREATE (c:Customer {name:'King'})-[:CREATES]->(:Order {status:'created'}),
       (c)-[:CREATES]->(:Order {status:'created'})

从Neo4j浏览器执行,以下查询在200毫秒内返回:

MATCH  (c:Customer)-[:CREATES]->(o:Order)
WHERE  c.name = 'King'
RETURN o.status

在Eclipse中执行此操作大约需要2500毫秒,有时最长可达3000毫秒:

String query = "MATCH  (c:Customer)-[:CREATES]->(o:Order) "
             + "WHERE  c.name = 'King' "
             + "RETURN o.status";
Result result = db.execute(query);

这非常慢!我究竟做错了什么? 另外,我在Eclipse中运行了以下代码片段,它只用了大约50毫秒:

Node king = db.findNode(NodeType.Customer, "name", "King");
Iterable<Relationship> kingRels = king.getRelationships(RelType.CREATES);
for(Relationship rel : kingRels) {
    System.out.println(rel.getEndNode().getProperty("status"));
}

所以实际上我有两件事让我感到惊讶:

  1. 在Neo4j浏览器中运行Cypher查询似乎比在Eclipse中使用Neo4j Core Java API做类似的事情要慢。
  2. 与Neo4j浏览器解决方案以及普通Java解决方案相比,在Java代码中“嵌入”运行Cypher查询的速度非常慢。
  3. 我很确定这不可能是真的。那么我做错了什么?

1 个答案:

答案 0 :(得分:0)

你如何测量它?如果你测量完整的运行时间,那么你的时间包括,jvm启动,数据库启动和类加载以及从磁盘加载存储文件。

请记住,在浏览器中,所有这些内容已经在运行,并且已经预热等等。

如果您真的想要测量查询,请多次运行以进行预热,然后仅测量查询执行和结果加载。

还要考虑使用指示的索引或约束和参数,例如:为您的customer.name。