我有以下情况:
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 endpoint和Batch operations。这些是否提高了写性能?哪种情况对上述情况更好?
看起来neo4jphp支持批处理和密码交易。但不确定是否可以在node-neo4j中实现批处理/密码交易。
答案 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基本操作聚合到一个事务中,以便在内存消耗和事务开销之间取得良好的平衡。