2016-08-03 5 views
1

Так я есть более 130M узлы одного типа и 500K узлы другого типа, я пытаюсь создать отношения между ними следующим образом:Как партия Neo4j Cypher запросов

MATCH (p:person) 
MATCH (f:food) WHERE f.name=p.likes 
CREATE (p)-[l:likes]->(f) 

Проблема заключается в том есть 130M отношения и я хотел бы сделать это аналогично PERIODIC COMMIT при использовании LOAD CSV

Есть ли такая функциональность для моего типа запроса?

ответ

0

Да, есть. Вам понадобится установленный APOC Procedures library (download here). Вы будете использовать функцию apoc.periodic.commit() в разделе Job Management. Из документации:

ВЫЗОВ apoc.periodic.commit (заявление, Params) - повторяет пакетное обновление заявление, пока она не возвращает 0, эта процедура блокирует

Вы будете использовать это в комбинации с предложением LIMIT, передавая предельное значение в качестве параметров.

Однако для достижения наилучших результатов вы хотите убедиться, что данные вашего соединения (f.name, я думаю) имеют индекс или уникальное ограничение для массового сокращения времени.

Вот как вы можете использовать его (предполагая, что из вашего примера, что человек любит только одну пищу, и что мы должны применять только это: лиц, которые уже не имеют набор отношений):

CALL apoc.periodic.commit(" 
MATCH (p:person) 
WHERE p.likes IS NOT NULL 
AND NOT (p)-[:likes]->(:food) 
WITH p LIMIT {limit} 
MATCH (f:food) WHERE p.likes = f.name 
CREATE (p)-[:likes]->(f) 
RETURN count(*) 
", {limit: 10000}) 
Смежные вопросы