如何在密码中创建带有可变标签的节点?

时间:2018-10-08 16:32:03

标签: json variables neo4j label cypher

我正在使用JSON APOC插件从带有列表的JSON创建节点,并且尝试创建其标签被列为列表中元素的节点:

{
    "pdf":[
        {
            "docID": "docid1", 
            "docLink": "/examplelink.pdf", 
            "docType": "PDF"
        }
],
    "jpeg":[
        {
            "docID": "docid20", 
            "docLink": "/examplelink20.pdf", 
            "docType": "JPEG"
        }
],
...,}

我想同时遍历doctype(pdf,jpeg)并将标签设置为列表中的docType属性。现在,我必须为每个文档类型列表(jpeg:[],pdf:[])做单独的块:

WITH "file:////input.json" AS url
CALL apoc.load.json(url) YIELD value
UNWIND value.pdf as doc
MERGE (d:PDF {docID: doc.docID})

我想遍历文档类型列表,为每个文档类型创建节点,并用标签作为列表名称(pdf)或节点的文档类型名称(PDF)。像这样:

WITH "file:////input.json" AS url
CALL apoc.load.json(url) YIELD value
for each doctypelist in value
for each doc in doctype list
MERGE(d:doc.docType {docID: doc.docID})

WITH "file:////input.json" AS url
CALL apoc.load.json(url) YIELD value
for each doctypelist in value
for each doc in doctype list
MERGE(d {docID: doc.docID})
ON CREATE SET d :doc.docType

1 个答案:

答案 0 :(得分:1)

Cypher当前不支持此功能。要设置标签,您必须将其硬编码到Cypher中。您可以做过滤器,也可以进行多个匹配,以单调乏味的方式进行操作,但是,如果不允许您将任何插件安装到Neo4j db中,我建议您要么在类型上放置索引,要么使用节点+关系而不是标签。 (有很多有效的文档类型,因此,如果您必须全部支持它们,那么纯Cypher会让您非常痛苦。)

但是,使用APOC,有一个procedure专门为此apoc.create.addLabels

CREATE (:Movie {title: 'A Few Good Men', genre: 'Drama'});
MATCH (n:Movie)
CALL apoc.create.addLabels( id(n), [ n.genre ] ) YIELD node
REMOVE node.genre
RETURN node;