我正在测试 Neo4J 作为我的应用程序数据库(SQL Server 或 Oracle)的搜索数据库。我的意图是爬取 RDBMS 数据库并将可搜索的内容复制到 Neo4J。稍后当用户请求搜索时,我可以使用 Neo4J 的图形搜索功能在我的 RDBMS 数据库中查找记录,方法是在 Neo4J 上执行搜索,这将返回满足搜索条件的主键值。
我使用 Neo4Client 编写了一个小型 C# 应用程序,它从 RDBMS 数据库中读取两个表并创建节点和节点之间的关系。此示例中的两个表是公式标题及其子表,即公式成分。
在一个小型数据库(两个表中约 50 行和约 250 行)上,我的抓取速度非常快。但是使用大型客户数据库(约 550K 和约 6M 行)测试应用程序,爬网速度太慢了。在我用于测试/研究的一些较旧的硬件上,我得到大约 4 行/秒(估计需要 36 小时来爬取 550K 表)。在我较新的开发系统上,我得到了大约 14 行/秒(估计需要 10 个小时来爬取 550K 表)。
我知道 Neo4JClient 驱动程序使用 Neo4J REST 接口,鉴于此类似的问题,似乎 Neo4J 不适合我的项目。
我考虑过多线程,但我认为这不适合这种情况。我确实打算对这个应用程序进行多线程处理,但不是在被爬取的单个表上。我要爬取的 RDMBS 中的表在逻辑上是相关的,因此是 Neo4J 关系,并且这些表组有几组。我曾计划在每组桌子上旋转一根线。最终,我需要爬取 12 组表中的 75 个表,我认为这种性能水平在生产环境中是不切实际的。
我已经发布了我的示例代码,希望有人能告诉我我正在以一种不太理想的方式做某事。我想知道是否有一种方法可以创建具有索引和关系的节点?目前这是一个两步过程,尽管它不会影响我上面提到的性能数字,因为 550K 表的代码不使用关系。我的测试应用程序首先创建头节点(550K 表,这是我上面提到的性能数据所依据的),然后创建成分节点和与头节点的关系。我预计当我测试成分节点的创建时,我的性能数据会更慢。
谢谢!