【问题标题】:Neo4j perform multiple actions within MERGE ON CREATENeo4j 在 MERGE ON CREATE 中执行多个操作
【发布时间】:2022-01-04 22:09:39
【问题描述】:

在下面的代码 sn-p 中,如果 MERGE = ON MATCH,我只想执行 1 个 SET 命令,如果 MERGE = ON CREATE,则执行剩余的代码(SET、UNWIND、MATCH、MERGE)。

但是,当我在 ON MATCH 过程中对查询进行 PROFILE 时,我可以看到数据库被最后 4 行、UNWIND、MATCH 和 MERGE 命令击中。如果我将它们注释掉,那么 db hits 会从 6 减少到 2。

有什么办法可以确保最后 4 行只在 ON CREATE 过程中运行,而不是在 ON MATCH 过程中运行?我尝试过一些愚蠢的事情,比如将 ON CREATE 下面的所有内容都用括号括起来,或者在两者之间用逗号等:-)

尝试像这样优化的原因是我有 150k+ json 对象,并且我试图尽可能加快加载过程。我也需要

谢谢!

PROFILE 
CALL apoc.load.json('file:///20220103.json')
//I will be iterating through 150k+ JSON objects here
YIELD value
WHERE value.skills <> []  

MERGE (j:Role {roleId: value.roleId})

ON MATCH
SET j.keep=true 
 
ON CREATE
SET  j.title =replace(value.title,'&amp;','&'), j.createdDate = datetime(), ...... etc

WITH value,j
UNWIND value.skills AS list
MATCH (s:Skill {name: toLower(list.skillname) })
MERGE (j)-[:HAS_SKILL{value:list.rank}]->(s)
 

【问题讨论】:

    标签: merge neo4j cypher


    【解决方案1】:

    我认为您可以像这样过滤掉刚刚创建的行:

    WITH value,j
    WHERE j.keep IS NULL
    UNWIND value.skills AS list
    

    【讨论】:

    • 嗯,我明白你的建议,但是当它到达查询的最后部分时,它已经在 ON MATCH 和 ON CREATE 中将节点更新为 j.keep = TRUE部分...也许如果我使用另一个标志来表示该目的会有所帮助,谢谢您的指导
    • 好的,是的,我现在已经正确测试了它,我只是在检查它是否存在之后才将 j.keep 设置为 ON CREATE 中的任何内容,然后我可以运行其余的步骤。 ..谢谢!
    • 您还可以尝试将查询的不同部分移动到调用块中。有时它们非常方便,因为您可以通过某种方式制作它们,这样它们就不会改变返回的行数。
    • 感谢您的提示,通过调用块您指的是调用子查询吗? neo4j.com/docs/cypher-manual/current/clauses/call-subquery
    • 是的,完全正确。如果我以后有时间,我会用它来更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    相关资源
    最近更新 更多