SET标签:将标签名称作为参数传递

时间:2014-11-28 13:00:37

标签: neo4j cypher neo4jrestclient

我有这样的查询:

  

展开{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

任何解决方法?

由于

3 个答案:

答案 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