我正在重构这个密码查询
MERGE(n:Entity:{type_} {{ent_id: "ABC123"}})
ON CREATE SET n.literal_forms = ["new label"]
ON MATCH SET n.literal_forms = apoc.coll.toSet(n.literal_forms + "new label")
以使MAP结构的列表(将与UNWIND一起使用(对于批量查询更具性能。
我解决第一个难题的想法是在查询中调用apoc.coll.toSet
(因为我需要引用匹配的节点,如果有的话(,为此,我尝试使用apoc.do.case
来处理上面在ON MATCH
中实现的逻辑。
到目前为止,我有一些类似的东西
UNWIND $attribs as row
CALL apoc.merge.node.eager(["Entity", row.type_], {ent_id: row.ent_match_crit}, {literal_forms: [row.literal_form]}, {}) yield node as n1
with n1, row
CALL apoc.do.case([
size(n1.literal_forms) >= 1,
"MATCH (n1) SET n1.literal_forms = apoc.coll.toSet(n1.literal_forms + row.literal_form)"
]) yield value
RETURN value.node as node
其中$attribs
类似于:
[{"type_": "Gene", "ent_match_crit": "CHEMBL2108755", "literal_form": "penicillinase"}, {"type_": "Gene", "ent_match_crit": "GO0008800", "literal_form": "beta-lactamase"}]
但是这个查询不会写入我的数据库(在merge.node
上,也不会写入case.do
中。当我插入示例值时,这个查询似乎在neo4j浏览器中工作,但当我使用映射结构列表在代码中执行时就不工作了。有人能帮我吗?
还有,有人看到更好的方法来做我正在努力做的事情吗?
顺便说一句,我需要使用apoc.merge.node
的原因是因为我需要动态创建/匹配节点标签类型。
提前谢谢。
晚上睡个好觉后,我意识到事情有点过于复杂,于是想出了这个解决方案:
UNWIND $attribs as row
CALL apoc.merge.node.eager(["Entity", row.type_], {ent_id: row.ent_match_crit}, {literal_forms: []}, {}) yield node as n1
with n1, row.literal_form as lf, n1.literal_forms as node_literals
SET n1.literal_forms = apoc.coll.toSet(node_literals + lf)
RETURN n1
此查询按预期工作。
如果有人看到更好的方法,请告诉我:(