【问题标题】:Neo4j - Using Java plugins to REST api to improve performance?Neo4j - 使用 Java 插件到 REST api 来提高性能?
【发布时间】:2014-02-03 15:28:41
【问题描述】:

我正在构建一个应用程序,该应用程序需要不断地从本地 MongoDB 中提取大量数据以放入 Neo4j。看到我也有很多用户从 Django 网络服务器和其他地方访问 Neo4j 数据库,我决定使用 Neo4j 的 REST 接口。

我遇到的问题是,即使使用批量插入,Neo4j 服务器也有超过 50% 的时间处于活动状态,只需尝试插入来自 mongoDB 的所有数据。据我所知,由于 HTTP 请求,可能会有一些等待时间,但我一直在尝试调整,但目前为止。

问题是,如果我编写一个可以直接处理插入 mongoDB 提取的 Java 插件 (http://docs.neo4j.org/chunked/stable/server-plugins.html),我会绕过 REST API 吗?还是 java 插件命令只是转换为常规的 REST API 请求?此外,使用该插件是否会提高性能?

最后一个问题是如何优化 REST API 的速度(到目前为止,我正在执行大约 1500 次读/写操作,其中包括许多“get_or_create_in_index”操作)?在下一个 HTTP 请求到达之前,附加到一个 HTTP 请求的查询数量是否会使 Neo4j 保持忙碌状态?

更新:

我使用的是 Neo4j 2.0 版

我提取的数据包括蓝牙观察结果,其中运行我创建的应用程序的手机会扫描附近的所有手机。然后将这个单一的观察结果保存为 MongoDB 中的一个文档,其中包含用户 ID、扫描时间以及他在该扫描中看到的电话/用户列表。

在 Neo4j 中,我将所有用户建模为节点,并将两个用户之间的观察建模为一个节点,使其看起来像这样:

(user1)-[observed]->(observation_node)-[observed]->(user2)

此外,我索引所有用户节点。

将观察结果从 mongoDB 移动到 Neo4j 时,我对每个文档执行以下操作:

  1. 如果执行扫描的用户已经分配了一个节点,则检查索引,否则创建一个
  2. 然后对于扫描中的每个观察到的用户: A) 如果观察到的用户有节点,则签入索引,否则创建一个 B) 创建观察节点以及用户与观察节点之间的关系,如果这还不存在C)在观察节点和时间线节点之间建立关系(时间线只是由一棵节点树组成,以便我可以快速找到某个时间的观察结果)

可以看出,我在用户索引 (3) 中进行了相当多的查找,一些正常的读取 (2-3) 以及每次观察可能进行的许多写入。

每个蓝牙扫描平均大约有 5-30 次观察,我在一个 HTTP 请求中批处理 100 次扫描。这意味着每个请求通常包含 5000-10000 次更新。

【问题讨论】:

    标签: performance rest neo4j


    【解决方案1】:

    你用的是什么版本?

    非托管扩展将使用底层 Java-API,因此速度更快,您还可以决定推送给它的数据的格式和协议。

    批量写入是明智的,这样您就不会在每次微小写入时产生 tx 开销。例如。在一次操作中聚合 10-50k 更新很有帮助。

    您所做的更新的具体形式是什么?您可以编辑您的问题以反映这一点吗?

    一些资源:

    【讨论】:

    • 感谢您的回答和文章!他们很有见地。我已经更新了这个问题。你认为这种从 Mongo 到 Neo4j 的转移是否有利于使用扩展,而不仅仅是调用 REST API 的 python 脚本?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多