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 основных операций в одну транзакцию, чтобы обеспечить хороший баланс между потреблением памяти и накладными расходами транзакций.

Другие вопросы по тегам