Проблема при синхронизации данных из mongodb в neo4j с разъемом mongo - PullRequest
0 голосов
/ 16 апреля 2019

Я использую mongodb и neo4j и синхронизирую данные с разъемом mongo и менеджером документов neo4j. При запуске mongo-connector все работает нормально, все мои документы в mongodb были очень хорошо синхронизированы с neo4j со всеми конкретными полями, которые я хочу, но при обновлении любого документа в mongodb возникает проблема. Все поля узла ( которые ссылаются на этот документ) в neo4j удаляются, и есть просто поле идентификатора neo4j и поле электронной почты.

Я использую режим отладки с коннектором монго и обнаружил, что pyneo (при обновлении документа в монго) удаляет узел, а затем создает другой узел только с полем электронной почты. Я использую Python 3.6.7

Вот как выглядит журнал коннектора mongo, когда я что-то изменяю в документе, py2neo удаляет узел, а затем создает другой, используя только поле электронной почты:

 2019-04-16 16:40:02,428 [DEBUG] mongo_connector.oplog_manager:271 
    - OplogThread: Operation for this entry is u
    2019-04-16 16:40:02,428 [INFO] py2neo.cypher:200 - begin
    2019-04-16 16:40:02,428 [INFO] py2neo.cypher:266 - append 'MATCH 
    (d:Document:`user_trustem`) WHERE d._id={doc_id} OPTIONAL MATCH 
    (d)-[r]-(c) DELETE r WITH d, c OPTIONAL MATCH (c)-[s]-() WITH 
    d,c,s, CASE WHEN s IS NULL THEN c ELSE NULL END AS n DELETE n' 
    {'doc_id': '5ca6043820f3b02227f2245a'}
    2019-04-16 16:40:02,428 [INFO] py2neo.cypher:266 - append 'MATCH [z][1](d:Document:`user_trustem`) WHERE d._id={doc_id} SET d={set_parameter}' {'doc_id': '5ca6043820f3b02227f2245a', 'set_parameter': {'email': 'ahmedgadria2@gmail.com'}}
2019-04-16 16:40:02,429 [INFO] py2neo.cypher:266 - append 'MATCH (d:Document:`user_trustem`) WHERE d._id={doc_id} SET d={set_parameter}' {'doc_id': '5ca6043820f3b02227f2245a', 'set_parameter': {'email': 'ahmedgadria2@gmail.com'}}
2019-04-16 16:40:02,429 [INFO] py2neo.cypher:331 - commit

до обновления после обновления

1 Ответ

0 голосов
/ 17 апреля 2019

Синтаксис SET n = $map (или устаревший синтаксис SET n = {map}) в основном удалит все существующие свойства в n и заменит их свойствами в параметре map.

Чтобы просто добавить / обновить свойства в n без удаления каких-либо свойств, вам необходимо использовать синтаксис SET n += $map.


Кстати, этот фрагмент:

WITH d, c
OPTIONAL MATCH (c)-[s]-()
WITH d,c,s, CASE WHEN s IS NULL THEN c ELSE NULL END AS n
DELETE n

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

FOREACH(x IN CASE WHEN NOT (c)--() THEN [c] END | DELETE x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...