我正在构建一个应用程序,需要从本地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时,我为每个文档执行以下操作:
可以看出,我在用户索引(3)中进行了大量的查找,一些正常的读取(2-3)以及每次观察可能有很多写入。
每次蓝牙扫描平均大约5-30次观察,我在一次HTTP请求中批量扫描100次。这意味着每个请求通常包含5000-10000个更新。
答案 0 :(得分:0)
您使用的是哪个版本?
非托管扩展将使用底层Java-API,因此速度更快,您也可以决定格式&你推送给它的数据的协议。
批量写入是明智的,因此每次微写时都不会产生tx开销。例如。在一次操作中聚合10-50k更新有很大帮助。
您所做的更新的具体形状是什么?你能编辑你的问题以反映这个问题吗?
一些资源: