2016-07-27 5 views
2

Я построю график neo4j. Размер составляет около 5 ГБ. Когда я хочу добавить отношение к каждому узлу, используя запрос cypher, такой как match (a)-[:know]-(b),(b)-[:know]-(c) merge (a)-[:maybe_know]-(c), я получаю ошибку GC overhead limit. Я не хочу увеличивать память для neo4j. Есть ли способ обновить узлы шаг за шагом? Как, во-первых, 5000 узлов, затем еще 5000 узлов ... Или у вас есть другие предложения по этому поводу?Neo4j GC верхний предел

+1

'LIMIT 5000' может быть? Если запрос стабилен (каждый раз производит одинаковое упорядочение), вы можете следить за «SKIP 5000 LIMIT 5000», а затем «SKIP 10000 LIMIT 5000» и т. Д. –

ответ

1

Как @twobit говорит, ограничьте свои партии чем-то управляемым, но также совместите только те вещи, которые еще не были сопоставлены. то есть, если a и c уже know друг с другом или связь между ними уже была создана, они никогда не будут совпадать с ними. Yould также мог убедиться, что идентификатор одного больше, чем другой, который гарантирует, что вы не будете делать одно и то же совпадение дважды (один раз в каждом направлении).

match (a)-[:know]-(b),(b)-[:know]-(c) 
where a <> c 
    and not (a)-[:know|maybe_know]-(c) 
    and id(a) > id(c) 
merge (a)-[:maybe_know]-(c) 
limit 1000 
+0

Вопрос здесь, занимает ли положение LIMIT вопрос? Будет ли какое-либо улучшение производительности, если мы использовали WITH после WHERE с LIMIT, затем выполнили слияние, или он заботится об этой оптимизации под капотом? – InverseFalcon

+0

Я бы ожидал, что они будут примерно одинаковыми. Один из способов узнать, хотя это будет профилировать каждую версию на одном и том же наборе данных. –

Смежные вопросы