cypher:在`merge ... on create`中使用`foreach`

时间:2014-08-11 19:26:39

标签: neo4j cypher

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

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

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行只执行on create(第2行),因为执行时间存在巨大差异。

括号不起作用。

我使用MERGE代替CREATE UNIQUE,因为我需要ON CREATE ... MERGE似乎更快。

我还要感谢任何进一步的优化。

2 个答案:

答案 0 :(得分:3)

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

恩典与和平,

吉姆

答案 1 :(得分:0)

    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