Performance Neo4j多客户端大量插入-REST性能非常差-其他方式?

Performance Neo4j多客户端大量插入-REST性能非常差-其他方式?,performance,rest,neo4j,server,insertion,Performance,Rest,Neo4j,Server,Insertion,我正在尝试在客户机-服务器环境中对Neo4j大规模插入进行基准测试。 到目前为止,我发现只有两种方法可以做到这一点: 休息 实现服务器扩展 我可以预先说,我们的设计要求能够从许多并发运行的进程/机器中插入,因此使用带有直接连接的批插入不是一个选项 我还希望避免实施服务器扩展,因为我们已经有很紧的时间表 我通过REST测试了单个客户端的大规模插入,发送了两种非常简单的密码查询: create (vertex:V {guid: {guid}, vtype: {vtype}, random1: {ra

我正在尝试在客户机-服务器环境中对Neo4j大规模插入进行基准测试。 到目前为止,我发现只有两种方法可以做到这一点:

  • 休息
  • 实现服务器扩展
  • 我可以预先说,我们的设计要求能够从许多并发运行的进程/机器中插入,因此使用带有直接连接的批插入不是一个选项

    我还希望避免实施服务器扩展,因为我们已经有很紧的时间表

    我通过REST测试了单个客户端的大规模插入,发送了两种非常简单的密码查询:

    create (vertex:V {guid: {guid}, vtype: {vtype}, random1: {random1}, random2: {random2} })
    
    match (a:V {guid: {a} }) match (b:V {guid: {b} }) create (a)-[:label]->(b)
    
    Guid字段具有索引

    到目前为止,与竞争产品如Titan或Orient相比,13分钟内(10k V+40k E)的性能非常差,后者提供了高效的服务器开箱即用,吞吐量约为每分钟(10k V+40k E)

    我尝试了更持久的事务和查询参数,但没有一个能带来显著的收益。此外,REST的开销非常小,因为我测试了虚拟查询,它们的执行速度要快得多(而且客户端和服务器都在同一台机器上)。我还尝试了从多个线程插入-性能无法放大

    我发现了另一个StackOverflow问题,其中的建议是批量插入到包含数千条命令的大型请求中,并定期提交。 不幸的是,由于我们如何生成数据的性质,批处理请求是不可行的。理想情况下,我们希望插入是原子操作,并在执行时立即显示结果(实际上不需要事务)

    因此,我的问题是:

  • 我的密码查询是否最适合插入
  • 到目前为止的结果是否与REST可以实现的结果一致(或者我可以从REST中挤出更多)
  • 是否有其他方法可以执行高效的多客户端大规模插入

  • 我有一些想法/问题不太适合评论;)

    • 您使用的是什么版本的Neo4j?2.3介绍了一些可能有用的东西

    • 当你说你有一个索引时,你是指新的样式而不是旧的索引吗?较新的索引是使用
      CREATE INDEX ON:V(guid)
      创建的,并应用于标签和属性的组合。您可以在带有
      PROFILE
      前缀的web控制台中尝试查询,以查看查询是否命中索引,以及查询速度可能较慢的位置

    • 如果您可以使用CSV格式的数据,您可以查看Cypher中的
      LOAD CSV
      子句。这也是一种批处理方式,因此可能没有那么有用

    • 我不认为这会对性能有多大帮助,但这是一个更好的阅读方式:

      匹配(a:V{guid:{a}),(b:V{guid:{b})创建(a)-[:标签]->(b)

    • 我知道现在这没有什么帮助,但Neo4j 3.0计划有一个新的压缩二进制套接字协议,名为Bolt,它应该比REST有所改进。估计是第二季度

    我知道这些建议中有很多可能没有太大帮助,但它们是需要考虑的。这里还有Neo4j的公开闲聊:

    我将在那里分享这个问题,看看是否有人有任何想法

    编辑:

    Max DeMarzi介绍了关于排队请求的一篇文章,这可能很有用:


    看起来您需要编写一点Java,但他为您列出了它

    我有一些想法/问题,这些想法/问题在评论中不太合适;)

    • 您使用的是什么版本的Neo4j?2.3介绍了一些可能有用的东西

    • 当你说你有一个索引时,你是指新的样式而不是旧的索引吗?较新的索引是使用
      CREATE INDEX ON:V(guid)
      创建的,并应用于标签和属性的组合。您可以在带有
      PROFILE
      前缀的web控制台中尝试查询,以查看查询是否命中索引,以及查询速度可能较慢的位置

    • 如果您可以使用CSV格式的数据,您可以查看Cypher中的
      LOAD CSV
      子句。这也是一种批处理方式,因此可能没有那么有用

    • 我不认为这会对性能有多大帮助,但这是一个更好的阅读方式:

      匹配(a:V{guid:{a}),(b:V{guid:{b})创建(a)-[:标签]->(b)

    • 我知道现在这没有什么帮助,但Neo4j 3.0计划有一个新的压缩二进制套接字协议,名为Bolt,它应该比REST有所改进。估计是第二季度

    我知道这些建议中有很多可能没有太大帮助,但它们是需要考虑的。这里还有Neo4j的公开闲聊:

    我将在那里分享这个问题,看看是否有人有任何想法

    编辑:

    Max DeMarzi介绍了关于排队请求的一篇文章,这可能很有用:


    看起来您需要编写一点Java,但他为您列出了它

    是否与
    {a}
    {b}
    相同?另外,您是否已经在
    :V(guid)
    上创建了索引(或唯一性约束)?是的,在guid字段上有索引。所有3个变量可能有不同的值,这2个查询将分别执行。但是,当我创建边时,我可以保证两个顶点都已创建。是否使用keepalive http连接?您的服务器有多少并发客户端和多少内核?你有ssd吗?您在磁盘或cpu监控中是否观察到任何异常情况?您使用的是哪个版本?与
    {a}
    {b}
    相同吗?另外,您是否已经在
    :V(guid)上创建了索引(或唯一性约束)