2014-01-15 26 views
1

我正在构建一个应用程序,它需要不断从本地MongoDB中提取大量数据,并将其放入Neo4j中。由于我也有许多用户从Django网络服务器和其他地方访问Neo4j数据库,因此我决定使用REST接口用于Neo4j。Neo4j - 将Java插件用于REST API以提高性能?

我遇到的问题是,即使使用批量插入,只要尝试从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请求的查询的数量将保持Neo4j繁忙,直到下一个HTTP请求到达?

更新:

我使用的Neo4j 2.0

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

在Neo4j的我的所有用户建模为节点和我也两个用户之间观测模型作为节点,使得其看起来像这样:

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

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

当移动从MongoDB中到Neo4j的观察,我做的每个文档以下:

  1. 检查中,如果用户做扫描已分配的一个节点索引,否则创建一个
  2. 然后对于扫描中的每个观察用户:A)检查索引,如果观察到的用户有一个节点,否则创建一个B)创建一个观察节点以及用户和观察节点之间的关系,如果这还没有存在的话。C)观测节点和时间轴节点之间的关系(时间轴只由一个节点树组成,以便我可以在特定时间快速找到观测结果)

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

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

回答

0

你使用的是什么版本?

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

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

你做什么更新的具体形状?你能编辑你的问题来反映吗?

一些资源是:

+0

感谢您的回答与文章!他们非常有见地。我已经更新了这个问题。你认为从Mongo到Neo4j的这种转移是否会对使用扩展而不仅仅是调用REST API的python脚本有利? – ReturnToZero