cypher:在“merge … on create”中使用“foreach”

kos*_*itz 1 neo4j cypher

我在 stackoverflow 上的第一个问题 - 是的。

\n\n

如果图片尚不存在,则以下查询应创建图片。url(清楚地描述了图片)titletags(数组)作为参数传递。每张图片都有一些标签,用节点表示。它有效,但速度不快。

\n\n
MERGE (pic:Picture {url:{url}})\nON CREATE\n  SET pic.title = {title}, pic.created = timestamp()\n  FOREACH (tagname IN {tags} |\n    MERGE (t:Tag {name:tagname})\n    MERGE (pic)-[:tag]->(t)\n  )\n
Run Code Online (Sandbox Code Playgroud)\n\n

set(第 3 行)只有在新创建图片时才会执行 - 很好。

\n\n

foreach(第 4 行)在每种情况下都会被执行 - 不好。

\n\n

有什么办法可以在一次查询中解决这个问题吗?我希望只执行第 4-7 行on create(第 2 行),因为执行时间存在巨大差异。

\n\n

括号不起作用。

\n\n

我使用MERGE而不是CREATE UNIQUE因为我需要ON CREATE\xe2\x80\xa6 并且MERGE似乎更快。

\n\n

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

\n

Jim*_*ard 5

伊科施维茨,

您可以使用临时属性和 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
Run Code Online (Sandbox Code Playgroud)

恩典与平安,

吉姆