使用mongo连接器将数据从mongodb同步到neo4j时出现问题

时间:2019-04-16 16:07:43

标签: mongodb neo4j cypher

我正在使用mongodb和neo4j并将数据与mongo连接器和neo4j文档管理器同步。启动mongo-connector时一切正常,我在mongodb中的所有文档都已与我想要的所有特定字段很好地同步到neo4j,但是在mongodb中更新任何文档时出现问题。节点的所有字段( neo4j中引用该文档的文档)被删除,只有neo4j的id字段和email字段。

我正在使用带有mongo连接器的调试模式,我发现pyneo(在mongo中更新文档时)会删除该节点,然后仅使用电子邮件字段创建另一个节点。我正在使用python 3.6.7

这是我更改文档py2neo中的某个内容时mongo连接器日志的样子,即删除该节点,然后仅使用电子邮件字段创建另一个节点:

 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

before updating after updating

1 个答案:

答案 0 :(得分:0)

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)