使用apoc为batchquery重新生成密码查询



我正在重构这个密码查询

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

此查询按预期工作。

如果有人看到更好的方法,请告诉我:(

最新更新