Ruby neo4j核心海量处理数据
有没有人使用Ruby来处理海量数据?具体来说,我希望从关系数据库中获取大约500k行,并通过以下方式插入它们:Ruby neo4j核心海量处理数据,ruby,neo4j,cypher,Ruby,Neo4j,Cypher,有没有人使用Ruby来处理海量数据?具体来说,我希望从关系数据库中获取大约500k行,并通过以下方式插入它们: Neo4j::Session.current.transaction.query .merge(m: { Person: { token: person_token} }) .merge(i: { IpAddress: { address: ip, country: country,
Neo4j::Session.current.transaction.query
.merge(m: { Person: { token: person_token} })
.merge(i: { IpAddress: { address: ip, country: country,
city: city, state: state } })
.merge(a: { UserToken: { token: token } })
.merge(r: { Referrer: { url: referrer } })
.merge(c: { Country: { name: country } })
.break # This will make sure the query is not reordered
.create_unique("m-[:ACCESSED_FROM]->i")
.create_unique("m-[:ACCESSED_FROM]->a")
.create_unique("m-[:ACCESSED_FROM]->r")
.create_unique("a-[:ACCESSED_FROM]->i")
.create_unique("a-[:ACCESSED_FROM]->r")
.create_unique("i-[:IN]->c")
.exec
然而,在本地进行这项工作需要花费数十万个小时的时间。到目前为止,我尝试了以下几点:
- 在ConnectionPool中包装Neo4j::Connection并对其进行多线程处理——我在这里没有看到多少速度改进
- 执行
和tx=Neo4j::Transaction.new
每处理1000个事件—查看TCP转储,我不确定这是否真的达到了我的预期。它以相同的频率执行完全相同的请求,但只是有不同的响应李>tx.close
.query(…).exec
时,我都会看到一篇文章:
- 请求:
Person{“语句”:[{“语句”:“合并(m:
{token:{m_Person_token}}”)。{“m_Person_token”:“AAA”…,“resultDataContents”:[“行”,“其余”]}
- 响应:
{“提交”:http://localhost:7474/db/data/transaction/868/commit“,“结果”:[{“列”:[],“数据”:[]}],“交易”:{“到期”:“2016年5月10日星期二23:19:25+0000”},“错误”:[]}
- 请求:
Person{“查询”:“合并(m:
{token:{m_Person_token}}”)。{“m_Person_token”:“AAA”…“c_国家名称”:“美国”}
- 响应:
{“列”:[],“数据”:[]}
neo4j导入
命令行实用程序(不过,这似乎有点老套)。
*结合以上我尝试过的两种技术
还有谁遇到过这个问题/有其他建议吗?好的
所以你完全正确。使用neo4j core
一次只能发送一个查询。使用事务,你真正得到的是回滚功能。neo4j确实有一个不错的事务HTTP JSON API,允许你在同一个HTTP请求中发送多个密码请求,但neo4j core
目前没有支持这一点(我正在为下一个主要版本进行重构,以实现这一点)
- 您可以通过原始HTTP JSON将请求提交到API。如果您仍然想使用
API,您可以使用查询
和to_cypher
方法获取密码和参数(merge_params
目前是一个私有方法,因此您需要merge_params
)发送(:merge_params)
- 正如你所说,你可以通过CSV加载
- 使用
命令,该命令允许您快速导入,但要求您将CSV置于特定格式,要求您从头开始创建DB,并要求您在导入后创建索引/约束neo4j import
- 使用
命令,虽然速度不快,但仍然相当快LOAD CSV
- 使用
- 您可以使用gem构建DSL以导入数据。gem将在封面下创建密码查询,并对其进行批处理以提高性能。请参阅通过和使用的gem示例
- 如果您更喜欢冒险,您可以通过GitHub repo上的分支使用
中的新Cypher API。该分支中的neo4j core
有一些关于API的文档,但如果您对此或其他方面有疑问,也可以随时访问我们的网站自述文件
MERGE
子句的情况下进行如上所述的查询,那么您可能需要分析您的查询以确保(这篇文章有点老,Neo4j的新版本减轻了一些护理需求,但您仍然可以在您的档案中查找Eager
)
也值得一看:马克斯·德·马尔齐在