我有这样的查询:
展开{data}作为行MERGE(p:Book {guid:row.bookGuid})设置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
任何解决方法?
由于
答案 0 :(得分:2)
您可以使用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])
另一个例子: Using Cypher and APOC to move a property value to a label
答案 1 :(得分: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
)
等等......
答案 2 :(得分: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