Neo4j 密码:在“merge…”中使用“foreach”;论创造`

Neo4j 密码:在“merge…”中使用“foreach”;论创造`,neo4j,cypher,Neo4j,Cypher,我关于stackoverflow的第一个问题-是的 下面的查询应该创建一张图片,如果它还没有url(清楚地描述了图片)、title和tags(数组)作为参数传递。每个图片都有一些标记,由节点表示。它能工作,但不快 MERGE (pic:Picture {url:{url}}) ON CREATE SET pic.title = {title}, pic.created = timestamp() FOREACH (tagname IN {tags} | MERGE (t:Tag

我关于stackoverflow的第一个问题-是的

下面的查询应该创建一张图片,如果它还没有
url
(清楚地描述了图片)、
title
tags
(数组)作为参数传递。每个图片都有一些标记,由节点表示。它能工作,但不快

MERGE (pic:Picture {url:{url}})
ON CREATE
  SET pic.title = {title}, pic.created = timestamp()
  FOREACH (tagname IN {tags} |
    MERGE (t:Tag {name:tagname})
    MERGE (pic)-[:tag]->(t)
  )
set
(第3行)仅在图片已新建-精细时执行

foreach
(第4行)将在每种情况下执行-不好

有没有办法在一个查询中解决这个问题?我只希望第4-7行在create(第2行)上执行
,因为执行时间存在巨大差异

括号不起作用

我使用
MERGE
而不是
CREATE UNIQUE
,因为我需要
来创建
…而
MERGE
似乎更快

我也将感谢任何进一步的优化。

jkoschwitz

您可以使用临时属性和WHERE子句来实现这一点。您还可以使用UNWIND子句使这一点变得更好

MERGE (pic:Picture {url:{url}})
ON CREATE
SET pic.title = {title}, pic.created = timestamp(), pic.new = 1
WITH pic
WHERE pic.new = 1
UNWIND {tags} as tagname
MERGE (t:Tag {name : tagname})
MERGE (pic)-[:tag]->(t)
REMOVE pic.new
恩典与和平


吉姆

非常感谢!对于数据库中已有的2000张图片,速度要快10倍。不幸的是,我还没有足够的声望投票支持你的答案。约书亚
    MERGE (pic:Picture {url:{url}})
    ON CREATE
        SET pic.title = {title}, pic.created = timestamp(), pic.new = 1
        FOREACH (tagname IN CASE WHEN pic.new = 1 THEN {tags} ELSE [] END |
            MERGE (t:Tag {name:tagname})
            MERGE (pic)-[:tag]->(t)
        )
        REMOVE pic.new