Как обновить существующий конкретный узел в graphdb, загрузив обновленный CSV-файл в neo4J apoc - PullRequest
2 голосов
/ 18 июня 2019

У меня проблема с обновлением узла путем загрузки недавно обновленного файла CSV в. Neo4j. Так как это большой файл, я думаю, что нужно использовать процедуру apoc. Я обновил существующий узел, загрузив внешний обновленный файл без apoc. но проблема в том, что мне нужно обновить его параллельно с помощью apoc. вот мой элемент файла

оригинальный элемент в файле

ID,SHOPNAME,DIVISION,DISTRICT,THANA
1795,ARAFAT DISTRIBUTION,RAJSHAHI,JOYPURHAT,Panchbibi
1796,CONNECT DISTRIBUTION,DHAKA,GAZIPUR,Gazipur Sadar
1797,HUMAYUN KABIR,DHAKA,DHAKA,Demra

Я создал узел из этого CSV

тогда у меня есть другой обновленный файл u.csv, обновленные элементы приведены ниже

ID,SHOPNAME,DIVISION,DISTRICT,THANA
1795,ABC,RAJSHAHI,JOYPURHAT,Panchbibi
1796,XYZ,DHAKA,GAZIPUR,Gazipur Sadar
1797,HUMAYUN KABIR,DHAKA,DHAKA,Demra

без apoc мой запрос был

LOAD CSV FROM "file:///u.csv" AS line
MERGE (c:Agent {ID:line[0]})
ON MATCH SET c.SHOPNAME = line[1]
RETURN c

Этот код обновил нужный столбец, за исключением того, что у меня есть пустой узел

{"ID":"ID"}

мой первый вопрос: почему создается новый пустой узел и как я могу решить эту проблему

Теперь я хочу обновить большой файл, поэтому я использовал процедуру apoc для пакетной обработки

с apoc мой запрос был

CALL apoc.periodic.iterate('LOAD CSV WITH HEADERS FROM "file:///u.csv" AS line return line','MERGE (p:Agent{ID:TOINTEGER(line.ID)}) ON MATCH SET p.SHOPNAME=TOINTEGER(line.SHOPNAME) ' ,{batchSize:10000, iterateList:true, parallel:true});

но я не смог обновить определенные узлы, вместо этого он создал два узла со связанным идентификатором, поэтому я получаю 5 узлов здесь, а не 3 узла

{"ID":1795} 
{"ID":1796}

Я очень новичок в neo4j, но пытаюсь учиться. пожалуйста, помогите мне решить проблему Я использую neo4j 3.5.6 и apoc 3.5.0.4

1 Ответ

2 голосов
/ 18 июня 2019

Я вижу 2-3 возможных проблемы здесь:

  • Относительно дублирующих узлов : Вы использовали функцию TOINTEGER в одних, а не в других данныхзапрос загрузки, поэтому узлы дублируются.Один узел Agent с id со строкой типа данных и другой узел Agent с id с целым типом данных.

Предложение: Используйте функцию TOINTEGER в обоих запросах или ни в одном.

  • Относительно пустых узлов: Во втором запросе вы устанавливаете свойство узла, только если узел найден (то есть ON MATCH).Но в первом случае мы обнаружили, что он создает новый узел каждый раз и не соответствует ни одному из предыдущих узлов.Также не устанавливается свойство при создании.Таким образом, будут узлы без SHOPNAME .

Предложение: Либо добавьте запрос ON CREATE к MERGE, либо удалите ON MATCH изЗапрос MERGE и обновление узла каждый раз.Добавление ON CREATE является рекомендуемым и эффективным способом.

Ниже приведен запрос с ON CREATE:

MERGE (c:Agent {ID:line[0]})
ON CREATE SET 
    c.SHOPNAME = line[1]
  • Вы такжепреобразование SHOPNAME в целое число в вашем запросе с помощью APOC с использованием TOINTEGER, это не будет работать.
...