我正在使用mongodb和neo4j,并与mongo连接器和neo4j文档管理器同步数据。启动mongo-connector时一切正常,我在mongodb中的所有文档都与neo4j很好地同步,具有我想要的所有特定字段,但是在更新mongodb中的任何文档时都存在问题。neo4j 中节点的所有字段(引用该文档(都将被删除,只有 neo4j 的 id 字段和电子邮件字段。
我正在使用带有mongo连接器的调试模式,我发现pyneo(在mongo中更新文档时(删除了该节点,然后创建了另一个仅包含电子邮件字段的节点。我正在使用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
更新之前更新后
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)