【问题标题】:Neo4j write performance improvementNeo4j 写入性能提升
【发布时间】:2014-12-23 02:06:32
【问题描述】:

我有如下场景:

CREATE (p:Person{guid:1})
CREATE (b1:Book{guid:1})
CREATE (b2:Book{guid:2})
CREATE (b3:Book{guid:3})

MATCH (p:Person{guid:1}),(b1:Book{guid:1}) CREATE (p)-[:READ]->(b1)
MATCH (p:Person{guid:1}),(b2:Book{guid:2}) CREATE (p)-[:READ]->(b2)
MATCH (p:Person{guid:1}),(b3:Book{guid:3}) CREATE (p)-[:READ]->(b3)

目前,上述密码查询是按顺序运行的。我需要提高写操作的性能。

我认为 p,b1,b2,b3 的创建可以并行发生。完成此操作后,p 和 b1、b2 和 b3 之间的连接可以并行发生。 另外,我认为上述查询可以在一个批次中进行,而不是单独的写入操作。

我正在使用 neo4jphpnode-neo4j

我想我们有Transactional Cypher HTTP endpointBatch operations。这些是否提高了写入性能?对于上述情况,哪个更好?

看起来 neo4jphp 支持批处理和密码交易。但不确定是否可以在 node-neo4j 中实现批量/密码交易。

【问题讨论】:

    标签: neo4j cypher neo4jphp node-neo4j


    【解决方案1】:

    您应该使用参数化 Cypher 来消除解析语句和构建查询计划的开销。

    在您的情况下,该语句可以更改为:

    MERGE (p:Person{guid:{personGuid}})
    MERGE (b:Book{guid:{bookGuid}})
    CREATE (p)-[:READ]->(b)
    

    并作为参数提供:

    { "personGuid": 1, "bookGuid": 1 }
    { "personGuid": 1, "bookGuid": 2 }
    { "personGuid": 1, "bookGuid": 3 }
    

    一定要有索引:

    CREATE INDEX ON :Person(guid)
    CREATE INDEX ON :Book(guid)
    

    使用事务端点尝试将大约 10k-50k 基本操作聚合到一个事务中,以在内存消耗和事务开销之间取得良好的平衡。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多