[ПРОБЛЕМА - Мое окончательное решение ниже]
Я хочу импортировать json-файл, содержащий мои данные, в Neo4J. Однако это очень медленно.
Файл Json имеет следующую структуру:
{
"graph": {
"nodes": [
{ "id": 3510982, "labels": ["XXX"], "properties": { ... } },
{ "id": 3510983, "labels": ["XYY"], "properties": { ... } },
{ "id": 3510984, "labels": ["XZZ"], "properties": { ... } },
...
],
"relationships": [
{ "type": "bla", "startNode": 3510983, "endNode": 3510982, "properties": {} },
{ "type": "bla", "startNode": 3510984, "endNode": 3510982, "properties": {} },
....
]
}
}
Аналогично предложенному здесь: Как восстановить данные из предыдущего результата в браузере?.
Посмотрев на ответ. Я обнаружил, что могу использовать
CALL apoc.load.json("file:///test.json") YIELD value AS row
WITH row, row.graph.nodes AS nodes
UNWIND nodes AS node
CALL apoc.create.node(node.labels, node.properties) YIELD node AS n
SET n.id = node.id
а потом
CALL apoc.load.json("file:///test.json") YIELD value AS row
with row
UNWIND row.graph.relationships AS rel
MATCH (a) WHERE a.id = rel.endNode
MATCH (b) WHERE b.id = rel.startNode
CALL apoc.create.relationship(a, rel.type, rel.properties, b) YIELD rel AS r
return *
(Мне нужно сделать это два раза, потому что в противном случае их отношения дублируются из-за двух unwind
).
Но это очень медленно, потому что у меня много сущностей, и я подозреваю, что программа выполняет поиск по всем из них для каждого отношения.
В то же время я знаю, что "startNode": 3510983
относится к узлу. Итак, вопрос: существует ли способ ускорить процесс импорта с использованием идентификаторов в качестве индекса или чего-то еще?
Обратите внимание, что мои узлы имеют разные типы. Поэтому я не нашел способа создать индекс для всех из них, и, полагаю, это было бы слишком много (память)
[МОЕ РЕШЕНИЕ]
CALL apoc.load.json('file:///test.json') YIELD value
WITH value.graph.nodes AS nodes, value.graph.relationships AS rels
UNWIND nodes AS n
CALL apoc.create.node(n.labels, apoc.map.setKey(n.properties, 'id', n.id)) YIELD node
WITH rels, COLLECT({id: n.id, node: node, labels:labels(node)}) AS nMap
UNWIND rels AS r
MATCH (w{id:r.startNode})
MATCH (y{id:r.endNode})
CALL apoc.create.relationship(w, r.type, r.properties, y) YIELD rel
RETURN rel