Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby neo4j核心海量处理数据_Ruby_Neo4j_Cypher - Fatal编程技术网

Ruby neo4j核心海量处理数据

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,

有没有人使用Ruby来处理海量数据?具体来说,我希望从关系数据库中获取大约500k行,并通过以下方式插入它们:

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
    tx.close
    每处理1000个事件—查看TCP转储,我不确定这是否真的达到了我的预期。它以相同的频率执行完全相同的请求,但只是有不同的响应
使用Neo4j::Transaction,每当调用
.query(…).exec
时,我都会看到一篇文章:

  • 请求:
    {“语句”:[{“语句”:“合并(m:
    Person
    {token:{m_Person_token}}”)。{“m_Person_token”:“AAA”…,“resultDataContents”:[“行”,“其余”]}
  • 响应:
    {“提交”:http://localhost:7474/db/data/transaction/868/commit“,“结果”:[{“列”:[],“数据”:[]}],“交易”:{“到期”:“2016年5月10日星期二23:19:25+0000”},“错误”:[]}
对于非Neo4j::Transactions,我看到了相同的发布频率,但以下数据:

  • 请求:
    {“查询”:“合并(m:
    Person
    {token:{m_Person_token}}”)。{“m_Person_token”:“AAA”…“c_国家名称”:“美国”}
  • 响应:
    {“列”:[],“数据”:[]}
(不确定这是否是预期的行为,但通过非Neo4j::Transaction技术传输的数据似乎较少-很可能我做了一些不正确的事情)

我还有其他一些想法: *将进程后置到CSV中,SCP up,然后使用
neo4j导入
命令行实用程序(不过,这似乎有点老套)。 *结合以上我尝试过的两种技术

还有谁遇到过这个问题/有其他建议吗?

好的

所以你完全正确。使用
neo4j core
一次只能发送一个查询。使用事务,你真正得到的是回滚功能。neo4j确实有一个不错的事务HTTP JSON API,允许你在同一个HTTP请求中发送多个密码请求,但
neo4j core
目前没有支持这一点(我正在为下一个主要版本进行重构,以实现这一点)

  • 您可以通过原始HTTP JSON将请求提交到API。如果您仍然想使用
    查询
    API,您可以使用
    to_cypher
    merge_params
    方法获取密码和参数(
    merge_params
    目前是一个私有方法,因此您需要
    发送(:merge_params)
  • 正如你所说,你可以通过CSV加载
    • 使用
      neo4j import
      命令,该命令允许您快速导入,但要求您将CSV置于特定格式,要求您从头开始创建DB,并要求您在导入后创建索引/约束
    • 使用
      LOAD CSV
      命令,虽然速度不快,但仍然相当快
  • 您可以使用gem构建DSL以导入数据。gem将在封面下创建密码查询,并对其进行批处理以提高性能。请参阅通过和使用的gem示例
  • 如果您更喜欢冒险,您可以通过GitHub repo上的分支使用
    neo4j core
    中的新Cypher API。该分支中的
    自述文件
    有一些关于API的文档,但如果您对此或其他方面有疑问,也可以随时访问我们的网站
如果您正在实现一个解决方案,该解决方案将在具有多个
MERGE
子句的情况下进行如上所述的查询,那么您可能需要分析您的查询以确保(这篇文章有点老,Neo4j的新版本减轻了一些护理需求,但您仍然可以在您的
档案中查找
Eager

也值得一看:马克斯·德·马尔齐在