3

我有一个这样的查询:

展开 {data} 作为行 MERGE (p:Book{guid:row.bookGuid}) set p.name=row.name, p:Science

我想将标签“科学”作为参数传递,因为这个标签对于我在 {data} 中传递的所有行都不相同。

我尝试了以下查询,但这会引发语法错误。

参数如下:{ guid:1, name:"testName1",label1:"Histroy"}

展开 {data} 作为行 MERGE (p:Book{guid:row.bookGuid}) 设置 p.name=row.name, p:row.label1

任何解决方法?

谢谢

4

3 回答 3

2

You can use APOC apoc.create.addLabels():

UNWIND {data} as row WITH row
MERGE (p:Book{guid:row.bookGuid})
SET p.name=row.name
CALL apoc.create.addLabels(id(p), [row.label1])

Another example: Using Cypher and APOC to move a property value to a label

于 2017-08-15T08:16:35.910 回答
1

我想您可以以不同的方式构建数据:

(:Book {guid, name})-[:HAS_LABEL]->(:Label {name})

通过这种方式,您可以在 CREATE 或 MATCH 查询中使用标签名称作为参数。您的原始查询将是:

UNWIND {data} as row WITH row 
MERGE (p:Book {guid: row.guid})
MERGE (l:Label {name: row.label})
CREATE UNIQUE p-[:HAS_LABEL]->l
SET p.name = row.name
于 2014-11-28T16:06:10.387 回答
1

是的,还不支持。如果你想让它工作,你必须使用 FOREACH 做一些黑客攻击,你必须为每种类型的标签做这些:

unwind {data} as row with row 
FOREACH(ignoreMe IN CASE WHEN row.label = "Science" THEN [1] ELSE [] END |
    MERGE (p:Book:Science{guid:row.bookGuid}) 
    set p.name=row.name
)

FOREACH(ignoreMe IN CASE WHEN row.label = "Math" THEN [1] ELSE [] END |
    MERGE (p:Book:Math{guid:row.bookGuid}) 
    set p.name=row.name
)

等等...

于 2014-11-28T15:58:44.383 回答