Neo4j写出性能提升

时间:2014-10-27 19:23:52

标签: neo4j cypher neo4jphp node-neo4j

我有以下情况:

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之间的连接可以并行进行。 另外,我认为上面的查询可以在一个批处理中进行,而不是单独的写操作。

我正在使用 neo4jphp node-neo4j

我认为我们有Transactional Cypher HTTP endpointBatch operations。这些是否提高了写性能?哪种情况对上述情况更好?

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

1 个答案:

答案 0 :(得分:1)

您应该使用paramterized 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基本操作聚合到一个事务中,以便在内存消耗和事务开销之间取得良好的平衡。