Java 为什么简单的密码查询这么慢?
在Oracle JDK 8和Windows 7上使用Neo4j 2.3.0社区版 我对Neo4j还不熟悉,只是在尝试如何使用Java。在Neo4j浏览器中,我使用以下语句创建了3个节点:Java 为什么简单的密码查询这么慢?,java,eclipse,neo4j,cypher,Java,Eclipse,Neo4j,Cypher,在Oracle JDK 8和Windows 7上使用Neo4j 2.3.0社区版 我对Neo4j还不熟悉,只是在尝试如何使用Java。在Neo4j浏览器中,我使用以下语句创建了3个节点: CREATE (c:Customer {name:'King'})-[:CREATES]->(:Order {status:'created'}), (c)-[:CREATES]->(:Order {status:'created'}) 从Neo4j浏览器执行,以下查询将在200毫秒
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"));
}
Node king=db.findNode(NodeType.Customer,“name”,“king”);
Iterable kingRels=king.getrelations(RelType.CREATES);
对于(关系关系rel:kingRels){
System.out.println(rel.getEndNode().getProperty(“status”);
}
所以实际上有两件事我很惊讶:
我很肯定这不可能是真的。那么我做错了什么呢?如何度量它?如果度量整个运行时,那么您的时间包括jvm启动、数据库启动、类加载以及从磁盘加载存储文件 记住,在浏览器中,所有这些都已运行,并已预热等 如果确实要测量查询,请运行多次以预热,然后仅测量查询执行和结果加载
也考虑使用指示或参数的索引或约束,例如为您的客户。名称。< /P>请尝试<代码>匹配(C:客户{Name:“King”})-[(创建)->(O:订单)并删除
WHERE
子句。在提出问题之前,我已经有了这一点,但性能没有变化。是否有客户(名称)
和订单(状态)的索引
?我没有任何索引,但因为我的数据库中只有3个节点和2个关系,所以索引应该不会有太大影响。我现在按照您的建议创建了索引。Neo4j浏览器中的密码查询真的变得更快了(对于Cypher查询,我在调用execute
之前和之后测量currentTimeMillies
。对于核心API,我测量整个try块,速度仍然快得多。我甚至从核心API开始,在一个main
方法中运行了两件事。因此,我怀疑这是一个预热问题。Ne没有垂直,我运行了几次:没有明显的变化。