【问题标题】:Should neo4j be very slow on a lot of merge requests?Neo4j 在很多合并请求上是否应该非常慢?
【发布时间】:2015-05-29 16:51:58
【问题描述】:

我遇到了一个非常慢的 neo4jhtop 显示它是 lucene 吃掉了服务器上的所有 CPU。

我主要是在写数据,每秒尝试 50-500 个 cypher 请求,每个请求都像

FOREACH (id in {ids} | MERGE (:Community {id: id}))

所有 3 个请求生成器都在这里 https://github.com/PublicRadio/VK_graph_reflector/tree/master/lib/reflectors(是的,JavaScript ES2015)

我开始怀疑 lucene 会因为 MERGE 请求而减慢一切,对吗?这可能是原因吗? 如果我是对的,我该如何优化所有这些东西?

【问题讨论】:

  • 您能分享一下您的查询的可视化查询计划吗?只需在其前面加上配置文件
  • 还有你所有的活动索引和约束,在浏览器中使用 :schema
  • 太棒了!谢谢,我的朋友!我发现了限制,现在我在本地机器上每分钟创建大约 30k 个节点,这太不可思议了!我很快会在服务器上试用它并检查它的运行情况,但它的性能得到了显着提升!

标签: performance neo4j lucene


【解决方案1】:

你能分享一下你的可视化查询计划吗?

只需在浏览器中获取查询并在其前面加上PROFILE

我认为这是很多事情:

  1. 使用密码参数而不是字符串替换
  2. 尝试仅合并具有约束(或索引)的单个属性
  3. 如果您不需要合并使用 MATCH,即如果数据已经存在!
  4. 如果您不需要唯一关系,请使用 CREATE,即当您知道只需将新节点连接到现有节点时。

类似这样的:

MATCH (group:VK_Group {id: {group_id} })
MERGE (post:VK_Wall_Post { id: {post_id}}) ON CREATE SET post.date={post_date} 
CREATE UNIQUE (group)-[:Published]-(post)
FOREACH (track IN {tracks} |
    MERGE (trackNode:VK_Track {id: track.id}) 
     ON CREATE SET trackNode.title=track.title, 
                   trackNode.duration=track.duration
    MERGE (artist:Artist {name: track.artist})
    MERGE (trackNode)<-[:Performed]-(artist)
    MERGE (post)-[:Attached]->(trackNode)
)

或者能够使用匹配循环:

MATCH (group:VK_Group {id: {group_id} })
MERGE (post:VK_Wall_Post { id: {post_id}}) ON CREATE SET post.date={post_date} 
CREATE UNIQUE (group)-[:Published]-(post)
UNWIND {tracks} as track
MERGE (trackNode:VK_Track {id: track.id}) 
       ON CREATE SET trackNode.title=track.title, 
                     trackNode.duration=track.duration
MERGE (artist:Artist {name: track.artist})
MERGE (trackNode)<-[:Performed]-(artist)
MERGE (post)-[:Attached]->(trackNode)

【讨论】:

  • 1, 2. 好的,知道了 3,4。我真的需要唯一的条目和(我认为至少)与唯一 ID 的关系,这很重要
  • 不要与唯一 ID 建立关系,因为它通常是不需要的。
猜你喜欢
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 2017-07-08
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
相关资源
最近更新 更多