Java-Neo4j 2.0中从Cypher查询检索结果的速度较慢

Java-Neo4j 2.0中从Cypher查询检索结果的速度较慢,java,neo4j,cypher,Java,Neo4j,Cypher,当我从Java中的Cypher查询执行中获得结果时,我在使用ResourceIterator检索结果时遇到了惊人的缓慢next()命令平均耗时156ms,标准偏差为385这是预期的行为,还是我做错了什么?有人能提出一种更有效的方法来实现同样的目标吗? 图形结构 我有以下图形布局,其中点节点与其他点有链接关系: 节点:点 属性: -idPoint(此属性上的新样式架构唯一约束) -x(此属性上的新样式架构索引) -y(此属性上的新样式架构索引) 关系:链接到 属性: -idLink -长度 (…

当我从Java中的Cypher查询执行中获得结果时,我在使用
ResourceIterator
检索结果时遇到了惊人的缓慢
next()
命令平均耗时156ms,标准偏差为385这是预期的行为,还是我做错了什么?有人能提出一种更有效的方法来实现同样的目标吗?


图形结构 我有以下图形布局,其中点节点与其他点有链接关系:

节点:点
属性:
-idPoint(此属性上的新样式架构唯一约束)
-x(此属性上的新样式架构索引)
-y(此属性上的新样式架构索引)

关系:链接到
属性:
-idLink
-长度
(…关系甚至在我的问题中都不起作用…)

图形统计:
-#节点数:890000
-#关系:91万


旧代码 (在Ubuntu上使用带有Oracle Java 7的Neo4j 2.0.0稳定版)
(基本上,此代码搜索给定点周围60x60正方形中的节点(点)

GraphDatabaseService graphDB=newGraphDatabaseFactory().newEmbeddedDatabase(“points_db”);
ExecutionEngine=新的ExecutionEngine(graphDB);
对于(坐标c:coords)//coords包含500个不同的坐标
{
int size=30;
int xMin=c.x——尺寸;
int xMax=c.x+大小;
int yMin=c.y-尺寸;
int yMax=c.y+尺寸;
String query=“匹配(n:点)”+
“其中n.x>”+xMin+
“和n.x<”+xMax+
“和n.y>”+yMin+
“和纽约<”+yMax+
“返回n作为邻居”;
ExecutionResult=engine.execute(查询);//command1
ResourceIterator ri=result.columnAs(“邻居”);//command2
while(ri.hasNext())
{
节点n=ri.next();//命令3
//…一些代码。。。
}
}
测量 command1平均执行时间:7.5毫秒

command2平均执行时间:您所做的不是图形查询,而是对整个数据库进行范围扫描

因此,它必须拉入所有节点,并对每个节点进行比较

通常,您可以通过将节点放入树(r树)中来解决此问题,该树将几何体编码为二维树结构,然后您可以仅在
log(levels)
复杂度中访问所需的任何形状

查看有关Neo4j spatial的演示,了解该主题:

您还可以强制Neo4j为每个节点重新解析和重新构建查询(500次)。 我同意Luane关于参数化的观点,所以你的问题应该是这样的。 您还应该在for循环的
之前拉取该命令:

String query = "MATCH (n:POINT) " +
                 "  WHERE n.x > {xMin}" +
                 "    AND n.x < {xMax}" +
                 "    AND n.y > {yMin}" +
                 "    AND n.y < {yMax}" +
                 "  RETURN n AS neighbour";

ExecutionResult result = engine.execute (query,
          map("xMin",xmMin,"xMax",xMax,"yMin",yMin,"yMax",yMax)); // query + params
String query=“匹配(n:POINT)”+
“其中n.x>{xMin}”+
“和n.x<{xMax}”+
“和n.y>{yMin}”+
“和n.y<{yMax}”+
“返回n作为邻居”;
ExecutionResult=engine.execute(查询,
映射(xMin,xmMin,xMax,xMax,yMin,yMin,yMax,yMax));//查询+参数

..

能否先将查询参数化,然后测量时间?这里有一个输入错误:
negihbour
。建议使用参数化。我改进了代码,新的测量速度明显加快。但我要说的是,它们仍然在“相同的范围内”。好吧,如果所有节点都被检查过,那么这就解释了很多。我天真地假设,如果我查询一个足够小的样本(根据我的经验,这种情况会发生在具有b树或类似索引的关系数据库中),那么我在x和y上的索引将在这里发挥作用。我知道Neo4j spatial project。大约半年前我已经用过了。但是,与使用Neo4j 2.0轻松创建新模式样式索引相比,它增加了相当多的复杂性,因此我希望可以避免使用它。。。因为这个查询是我的应用程序中唯一的地方,所以我可以从空间r树索引中获益。