Как вы можете вставить вложенный список в neo4j (язык запросов cypher) с прямой связью

#neo4j #cypher

#neo4j #шифр

Вопрос:

Я хочу вставить многоуровневый список в neo4j 4.1.1 с помощью языка запросов cypher.

Данные, которые я хочу вставить, представляют собой список отчетов, возвращаемых в формате 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",
                "id": "id of the model",
                "isPlanning": true
            },
            {
                "description": "Model 3",
                "id": "id of the model",
                "isPlanning": true
            },
          
        ],
        "changedBy": "TRAINING1",
        "openURL": "URL of the report"
    },
     {
        "name": "Report 2",
        "description": "Report Description",
        "createdBy": "TRAINING1",
        "id": "0653F758E5264C49E10000000A4E740E",
        "created": "2020-02-14T14:27:56.371Z",
        "changed": "2020-02-14T14:27:56.371Z",
        "isTemplate": false,
        "isSample": false,
        "models": [
            {
                "description": "Model description",
                "id": "id of the model",
                "isPlanning": true
            },
            {
                "description": "Model description",
                "id": "id of the model",
                "isPlanning": true
            },
            {
                "description": "Model description",
                "id": "id of the model",
                "isPlanning": true
            },
          
        ],
        "changedBy": "TRAINING1",
        "openURL": "URL of the report"
    },
    {
        "name": "Report Name 3",
        "description": "Report description 3",
        "createdBy": "TRAINING1",
        "id": "0653F758E5264C49E10000000A4E740E",
        "created": "2020-02-14T14:27:55.010Z",
        "changed": "2020-02-14T14:27:55.010Z",
        "isTemplate": false,
        "isSample": false,
        "models": [
            {
                "description": "description of the model",
                "id": "id of the model",
                "isPlanning": true
            },
            {
                "description": "model description",
                "id": "this is an id",
                "isPlanning": true
            },
            {
                "description": "model description",
                "id": "this is an id",
                "isPlanning": true
            }
        ],
        "changedBy": "TRAINING1",
        "openURL": "URL of the report"
    }
]
  

График, которым я хотел бы стать, выглядит следующим образом:
Примерный график

Запрос, который я пробовал, был следующим:

 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 }
          ON MATCH SET m = {id: model.id, description: model.description }
          
      RETURN sac
  

Я получаю следующую ошибку: Neo4jError: требуется С между слиянием и РАЗМОТКОЙ (строка 7, столбец 11 (смещение: 181)).

Есть предложения о том, как выполнить эту операцию?

Заранее спасибо!

Ответ №1:

Я думаю, что ON CREATE и ON MATCH поддерживает только одно SET предложение. И вы никогда не создаете связь между отчетом и моделью в своем запросе. И если вы объединяете по идентификатору узла, вы не хотите затем перезаписывать его в 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)
  

Комментарии:

1. Спасибо за ответ. Причина, по которой у меня не было этой связи, заключалась в том, что я не смог создать узлы. Пытаясь выполнить ваш запрос, я получаю следующую ошибку: Neo4jError: между MERGE и UNWIND требуется WITH (строка 5, столбец 9 (смещение: 177)) » UNWIND props.models как модель»