Neo4j - 使用Java插件来REST api来提高性能?

时间:2014-01-15 08:48:50

标签: performance rest neo4j

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

我遇到的问题是,即使批量插入,只需尝试插入来自mongoDB的所有数据,Neo4j服务器在50%的时间内处于活动状态。据我所知,由于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中,我将所有用户建模为节点,我还将两个用户之间的观察模型建模为节点,以便它看起来像这样:

(用户1) - [观察] - GT;(observation_node) - [观察] - GT;(用户2)

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

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

  1. 检查索引是否已执行扫描的用户已分配节点,否则创建一个
  2. 然后对于扫描中的每个观察用户:A)检查索引是否观察到的用户有节点否则创建一个B)创建观察节点以及用户和观察节点之间的关系(如果这还不存在) C)在观察节点和时间线节点之间建立关系(时间线只包含节点树,以便我可以在特定时间快速找到观察结果)
  3. 可以看出,我在用户索引(3)中进行了大量的查找,一些正常的读取(2-3)以及每次观察可能有很多写入。

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

1 个答案:

答案 0 :(得分:0)

您使用的是哪个版本?

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

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

您所做的更新的具体形状是什么?你能编辑你的问题以反映这个问题吗?

一些资源: