如何用Cypher/APOC创建参数名取自导入文件的节点参数
如何在Neo4j中动态创建节点属性(从JSON导入时)
我是Neo4j新手,正在导入JSON格式数据,已完成读取文件、创建节点和关系的基础步骤,但不知如何动态创建节点参数。我尝试使用SET j[issn.type] = issn.value语句,期望以JSON数据中的issn.type值作为参数名,为Journal节点j设置对应issn.value的参数值,但j[issn.type]写法无法正常工作,请问该如何实现?
原始查询语句:
call apoc.load.directory("*.json") yield value as files unwind files as file CALL apoc.load.json(file) YIELD value as object UNWIND object.items AS entry MERGE (p:Publisher {name: entry.publisher}) MERGE (j:Journal {name: entry.`container-title`}) ON CREATE SET j.created = timestamp() FOREACH (issn IN entry.`issn-type` | SET j[issn.type] = issn.value ) MERGE (p)-[r:publishes]->(j) ON CREATE SET r.created = timestamp() RETURN p
Cypher原生的SET语法不支持直接用变量作为属性名实现动态赋值,你需要借助APOC库的apoc.create.setProperty函数来完成需求。
修改后的可执行查询
call apoc.load.directory("*.json") yield value as files unwind files as file CALL apoc.load.json(file) YIELD value as object UNWIND object.items AS entry MERGE (p:Publisher {name: entry.publisher}) MERGE (j:Journal {name: entry.`container-title`}) ON CREATE SET j.created = timestamp() FOREACH (issn IN entry.`issn-type` | CALL apoc.create.setProperty(j, issn.type, issn.value) YIELD node ) MERGE (p)-[r:publishes]->(j) ON CREATE SET r.created = timestamp() RETURN p
关键说明
apoc.create.setProperty(node, propertyKey, propertyValue)是APOC提供的动态属性设置函数:- 第一个参数为目标节点
- 第二个参数为动态属性名(字符串类型,对应你的
issn.type) - 第三个参数为属性值(对应你的
issn.value)
- Neo4j 4.0及以上版本支持在
FOREACH内部嵌套CALL语句,因此可以循环处理每个issn条目 - 确保你的Neo4j已安装并启用APOC库:需在
neo4j.conf中添加dbms.security.procedures.unrestricted=apoc.*,然后重启数据库
内容的提问来源于stack exchange,提问作者jallmer
相关产品推荐
相关产品推荐

