问题描述
我想通过密码查询语言在neo4j 4.1.1中插入一个多级列表。
我要插入的数据是json中返回的报告列表。属性之一是报表背后的模型。我想为列表中的每个报表创建一个节点,再为给定报表上的每个模型创建一个节点,并在报表和模型之间(在报表上给定)添加关系。这将是每天一次的数据刷新,因此,如果neo4j数据库中不存在新的报告节点,那么我想创建它们,如果报告已经存在,我想在有新信息的情况下覆盖数据。
示例数据:
[
{
"name": "Report 1","description": "Report Description","createdBy": "TRAINING1","id": "04CA095985D9A838E10000000A4E740E","created": "2020-02-14T14:27:56.371Z","changed": "2020-02-14T14:27:56.371Z","istemplate": false,"isSample": false,"models": [
{
"description": "Model 1","id": "id of the model","isPlanning": true
},{
"description": "Model 2",{
"description": "Model 3",],"changedBy": "TRAINING1","openURL": "URL of the report"
},{
"name": "Report 2","id": "0653F758E5264C49E10000000A4E740E","models": [
{
"description": "Model description",{
"description": "Model description",{
"name": "Report Name 3","description": "Report description 3","created": "2020-02-14T14:27:55.010Z","changed": "2020-02-14T14:27:55.010Z","models": [
{
"description": "description of the model",{
"description": "model description","id": "this is an id","isPlanning": true
}
],"openURL": "URL of the report"
}
]
我想成为的图形如下: Example graph
我尝试的查询如下:
UNWIND $propsArray as props
MERGE (sac:sacreports { id: props.id })
ON CREATE
SET sac = {id: props.id,name: props.name }
UNWIND props.models as model
MERGE (m: sacmodels {id: model.id})
ON CREATE SET m = {id: model.id,description: model.description }
ON MATCH SET m = {id: model.id,description: model.description }
ON MATCH
SET sac = {id: props.id,name: props.name,description: props.description }
UNWIND props.models as model
MERGE (m: sacmodels {id: model.id})
ON CREATE SET m = {id: model.id,description: model.description }
RETURN sac
我收到以下错误消息:Neo4jError:MERGE和UNWIND之间需要WITH(第7行,第11列(偏移量:181))。
关于如何执行此操作的任何建议?
谢谢!
解决方法
我认为ON CREATE
和ON MATCH
仅支持单个SET
子句。而且,您永远不会在查询中的报表和模型之间建立关系。而且,如果要按节点的ID进行合并,则不想在ON CREATE
语句中覆盖它。我将使用以下查询:
UNWIND $propsArray as props
MERGE (sac:sacreports { id: props.id })
ON CREATE SET sac += {name: props.name,description: props.description}
WITH sac,props
UNWIND props.models as model
MERGE (m: sacmodels {id: model.id})
ON CREATE SET m += {description: model.description }
MERGE (sac)-[:IS_USED_IN]->(m)