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.
Я думаю, что у нас есть конечная точка HTTP Transactional 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)
Используя конечную точку транзакции, попытайтесь объединить ~ 10–50 000 основных операций в одну транзакцию, чтобы обеспечить хороший баланс между потреблением памяти и накладными расходами транзакций.