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

2024-03-15

我的结果检索速度出奇地慢ResourceIterator<Node>当我从 Java 中的 Cypher 查询执行获得结果时。next()命令平均需要 156 毫秒,标准偏差为 385!这是预期的行为,还是我做错了什么?有人能建议一种更有效的方法来实现同样的目标吗?


图结构

我有以下图形布局,其中 Point 节点与其他点有 LinksTo 关系:

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

关系:链接
特性:
- idLink
- length
(...关系在我的问题中甚至没有发挥作用...)

图表统计:
- 节点数量:890,000
- 关系数量:910,000


Old code

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

GraphDatabaseService graphDB = new GraphDatabaseFactory ( ).newEmbeddedDatabase ("points_db");

ExecutionEngine engine = new ExecutionEngine (graphDB);

for (Coordinate c : coords) // coords holds 500 different coordinates
{
    int size = 30;
    int xMin = c.x - size;
    int xMax = c.x + size;
    int yMin = c.y - size;
    int yMax = c.y + size;

    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); // command1

    ResourceIterator<Node> ri = result.columnAs ("neighbour"); // command2

    while (ri.hasNext ( ))
    {
        Node n = ri.next ( ); // command3
        // ... some code ...
    }
}

测量

命令1平均执行时间:7.5毫秒
command2平均执行时间:command3 平均执行时间:156 ms(标准差为 358)

(500次迭代(不同坐标)进行的测量,每次迭代平均找到6个点。测量是可重复的。)


编辑 1 (根据 Luanne 和 Michael 的建议)

带参数化的新的、更快的代码

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

GraphDatabaseService graphDB = new GraphDatabaseFactory ( ).newEmbeddedDatabase ("points_db");

ExecutionEngine engine = new ExecutionEngine (graphDB);
Map<String, Object> params = new HashMap<> ( );

int size = 30;
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";

for (Coordinate c : coords) // coords holds 500 different coordinates
{
    params.put ("xMin", (int) c.x - size);
    params.put ("xMax", (int) c.x + size);
    params.put ("yMin", (int) c.y - size);
    params.put ("yMax", (int) c.y + size);

    ExecutionResult result = engine.execute (query, params); // command1

    ResourceIterator<Node> ri = result.columnAs ("neighbour"); // command2

    while (ri.hasNext ( ))
    {
        Node n = ri.next ( ); // command3
        // ... some code ...
    }
}

测量

command1平均执行时间:1.7 ms
command2平均执行时间:command3 平均执行时间:112 ms(标准差为 270)
(500次迭代(不同坐标)进行的测量,每次迭代平均找到6个点。测量是可重复的。)


您所做的不是图形查询,而是对整个数据库的范围扫描。

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

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

查看有关该主题的 Neo4j 空间的演示:

http://neo4j.org/develop/spatial http://neo4j.org/develop/spatial

您还强制 Neo4j 重新解析并重新构建每个节点的查询(500 次)。 我同意 Luanne 关于参数化的观点,因此您的查询应该如下所示。 你也应该在for-loop:

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

....

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中 Cypher 查询的结果检索速度慢 - Neo4j 2.0 的相关文章

随机推荐

  • CSS 动态创建列

    我有三个 div 要素 div class foo A div div class foo B div div class foo C div 期望的行为 我想编写一些CSS来随着屏幕尺寸的变化创建以下效果 不良行为 我知道如何实现以下 不
  • 如何增加数组的长度

    我有一个快速的问题 我在 java 中有一个整数数组 它的长度需要在整个类中变化 具体来说 我需要在某些情况下将其增加一 我这样尝试过 sbgHeadX new int numberOfSBG 当我需要时 我会增加整数变量 numberOf
  • JavaFX TableView scrollTo() 导致错误的行开始编辑

    我有一个可编辑的 TableView 其中有一个按钮添加新行 然后在该行的第一列上调用 table edit 当用户想要添加不在视口之外的行时 应该发生的情况是表格在视口内滚动新行并开始编辑 但是 调用 table scrollTo new
  • 在一天中的特定时间(例如,商店“营业时间”)显示 DIV

    我需要切换DIV基于时间的可见性 以便我的网站显示我的实体店何时营业 例如 07 00 15 59 显示 div 16 00 06 59 隐藏 div Thanks 这是一个基本示例 gets the current time var d
  • 如何在 MySQL 查询中使用正则表达式

    我有一个简单的任务 我需要搜索以字符串字符开头及其后一个数字的记录 我正在尝试的是这个 SELECT trecord FROM tbl WHERE trecord LIKE ALA d And SELECT trecord FROM tbl
  • 按 Enter 时未启动搜索活动

    按 Enter 时不会启动搜索活动 搜索视图在操作栏上显示得很好 但是当我输入搜索查询并按 Enter 键时 AndroidManifest xml
  • 由测试容器存储启动的 Ryuk 容器不会停止单例容器

    我有几个测试节点 但我将容器作为单例运行 ActiveProfiles test SpringBootTest webEnvironment SpringBootTest WebEnvironment RANDOM PORT AutoCon
  • 两个日期之间的周 Java + Joda 时间

    我想获取 Java 中两个日期范围之间的周数和月数 例如 开始日期 03 01 2012 结束日期 03 05 2012 由于这两个日期属于不同的两周 我希望结果为 2 而不是 0 问题的第二部分是 开始日期 02 29 2012 结束日期
  • IE可枚举垃圾创建

    我在实现 IEnumerable 接口的对象池中有以下代码 public IEnumerable
  • 使用 MongoDB 搜索实现自动完成功能

    我有一个MongoDB表格文件的收集 id 42 title candy can description canada candy canteen brand cannister candid manufacturer candle can
  • 如何增加条形图条形之间的间距

    How do I increase the space between each bar with matplotlib barcharts as they keep cramming them self to the centre thi
  • 强制不同的线程休眠

    所以我有一个程序可以充当其他程序的 外壳 它的核心是传递一个类 一个方法名称和一些参数 并处理函数的执行 其想法是允许其他程序员基本上安排他们的进程在此 shell 服务上运行 除了一个问题之外 一切正常 通常 这些计划执行的进程会占用大量
  • 获取模块中定义的所有常量的值

    我想获取模块中定义的所有常量的值 module Letters A apple freeze B boy freeze end constants给了我常量的名称 Letters constants false gt A B 我如何获得它们
  • sidekiq - 并发 > 50 稳定吗?

    Sidekiq 文档 https github com mperham sidekiq wiki Advanced Options concurrency says 不要将并发设置高于 50 我见过稳定性问题 以并发数100为例 好吧 我的
  • pandas 中的 [] 和 [[]] 有什么区别? [复制]

    这个问题在这里已经有答案了 我对 pandas 中索引列的结果感到困惑 Both db varname and db varname 给我 varname 的列值 然而 看起来有一些细微的差别 因为输出db varname 显示值的类型 第
  • 为什么需要连接来创建PreparedStatements?

    我想使用准备好的语句很多原因 https stackoverflow com questions 687787 how should i sanitize database input in java 但是 我想创建一个如下所示的方法 Th
  • Windows 上的 gVIM:执行缓冲区和带空格的路径

    在 Windows 版 gVim 中 可以通过 命令执行当前缓冲区 但是 不幸的是 缓冲区文件名提供给 cmd exe 时不带引号 因此如果文件路径有空格 gVim 将无法执行它 有没有简单的方法来修复它以便能够从 gVim 中执行 bat
  • 如何创建连续的组号

    我有一个数据框 all data 其中我有一个网站列表 1 到 n 及其分数 例如 site score 1 10 1 11 1 12 4 10 4 11 4 11 8 9 8 8 8 7 我想创建一个列 按数字顺序对站点的每个级别进行编号
  • 在 asp.net/C# 中使用 LinqToSql 对 row_number 进行排序

    我在数据库表中有一组记录 我们称之为组件表 定义为follows http postimage org image 2a20tc8ck 管理员可以使用表的最后一列禁用标志来禁用某些组件 如果某个特定组件被禁用 它不应出现在用户的网格视图中
  • Java 中 Cypher 查询的结果检索速度慢 - Neo4j 2.0

    我的结果检索速度出奇地慢ResourceIterator