【发布时间】: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 时,我对每个文档执行以下操作:
- 如果执行扫描的用户已经分配了一个节点,则检查索引,否则创建一个
- 然后对于扫描中的每个观察到的用户: A) 如果观察到的用户有节点,则签入索引,否则创建一个 B) 创建观察节点以及用户与观察节点之间的关系,如果这还不存在C)在观察节点和时间线节点之间建立关系(时间线只是由一棵节点树组成,以便我可以快速找到某个时间的观察结果)
可以看出,我在用户索引 (3) 中进行了相当多的查找,一些正常的读取 (2-3) 以及每次观察可能进行的许多写入。
每个蓝牙扫描平均大约有 5-30 次观察,我在一个 HTTP 请求中批处理 100 次扫描。这意味着每个请求通常包含 5000-10000 次更新。
【问题讨论】:
标签: performance rest neo4j