Если ваш набор данных большой, вы не хотите выполнять какой-либо запрос, который работает со всей меткой, вы почти гарантированно увидите всплеск памяти, тайм-аут и, в конечном итоге, ошибку OutOfMemory в журналах neo4j. Порядок, в котором вы должны выполнять эти запросы, следующий:
1) Сделать индексы.
2) Объединить один из наборов данных и объединить отношения заранее вот так и использовать периодическую фиксацию, чтобы вам не приходилось хранить весь результат в памяти [EDIT: поскольку RegistrationID не является уникальным свойство, создайте для него резервный узел, чтобы часть ваших отношений могла быть предварительно построена]:
USING PERIODIC COMMIT 500
load csv with headers from "https://data.cityofnewyork.us/api/views/tesw-yqqr/rows.csv?accessType=DOWNLOAD" as row
CREATE (b:Building) SET b=row
MERGE (i:RegistrationID {RegistrationID: row.RegistrationID})
MERGE (b) - [:CONTACTS_FOR] -> (i)
3) Затем объедините другой набор данных. Ваш существующий индекс гарантирует, что если вы используете MERGE
вместо CREATE
, вы получите уже созданные узлы RegistrationID, которые вы вернули на последнем шаге:
USING PERIOD COMMIT 500
load csv with headers from "https://data.cityofnewyork.us/api/views/feu5-w2e2/rows.csv?accessType=DOWNLOAD" as row
CREATE (c:Contact) SET c = row
MERGE (i:RegistrationID {RegistrationID: row.RegistrationID})
MERGE (i) - [:CONTACT_FOR] -> (c)
Чтобы запросить контакты путем построения, используйте оператор * следующим образом:
MATCH (b:Building) WHERE <whatever conditions you want>
WITH b
MATCH (b) <- [:CONTACT_FOR*2] - (c)
RETURN c
Теперь, если ваши данные уже есть и вы не хотите перезагружать, вам придется использовать SKIP и LIMIT в своем запросе, чтобы обрабатывать только фрагмент за раз:
MATCH (b:Building)
WITH b
SKIP 0
LIMIT 500
MATCH (c:Contact) WHERE c._id = b._id
MERGE (b) - [:CONTACTS_FOR] -> (c)
а затем запустите его несколько раз, каждый раз перемещая SKIP и LIMIT вверх на 500.
Даже если ваша машина теоретически способна обрабатывать такой большой запрос, существуют ограничения, установленные как neo4j , так и JVM, на которой он работает, что может помешать вам использовать его. Попробуйте придумать решение, которое использует множество маленьких итерационных запросов вместо одного большого, обычно это намного эффективнее.
person
Tore Eschliman
schedule
12.09.2016