Можно ли динамически установить имя переменной узла для каждого узла, созданного во время UNWIND? - PullRequest
0 голосов
/ 01 марта 2019

Предположим, у меня есть параметр с именем узлов:

"nodes": [
    {
      "name": "John",
      "age": 18.0,
      "label": "Person",
      "labeledName": "Unit1"
    },
    {
      "name": "Phill",
      "age": 23.0,
      "label": "Animal",
      "labeledName": "Unit2"
    }
  ]

Я хочу развернуть параметр и создать узел для каждой карты с перечисленными парами свойство-значение.Однако мне нужно повторно использовать некоторые из этих узлов позже в запросе, поэтому мне нужно установить переменную для каждого из них.Кроме того, я хочу динамически установить эту переменную (чтобы два узла не имели одинаковое имя).Имя переменной будет значением свойства «labeleledName».

По сути, для узлов, перечисленных выше, мне нужно сделать:

CREATE (Unit1: Person{имя: 'Джон', возраст: '18'})

CREATE (Единица 2: Животное {имя: 'Фил', возраст: '23'})

Естьдве проблемы, которые я не могу решить при использовании UNWIND для одной и той же вещи:

  1. Я не могу установить имя переменной для каждого узла
  2. Я не могу установитьсвойства "name" и "age", в то время как пропущены "label" (поскольку он используется только в качестве метки узла) и "labeleledName"

    Это означает, что что-то подобное не работает:

UNWIND {узлы} как узел СО, узел, метка AS узла.label, имя узла.labeledName AS имя переменной CREATE (variableName: label) SET variableName + = node // каким-то образом нужно дать ему знать НЕустановить свойства «label» и «labeleledName»

Вот где я застрял.Использование node.labeledName AS переменная имя не работает (но использование метки AS node.label работает)

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 26 марта 2019

Итак, во-первых, вы не можете динамически присваивать имена переменных, это невозможно в Cypher.

Но ... используя процедуры APOC, вы можете создать карту с именем строки (вашей меткойName) для узла, который высоздайте, а затем выполните динамический поиск на карте, чтобы добраться до ваших узлов.

Кроме того, вы не можете динамически устанавливать метку с помощью Cypher, но снова мы можем использовать для этого процедуры APOC.

Мы можем снова использовать APOC, чтобы удалить свойство из входных карт для установки свойств.

Вот пример.Обратите внимание, что вы не можете использовать строковые ключи в кавычках на своих картах, поэтому я удалил их:

UNWIND [
    {
      name: "John",
      age: 18.0,
      label: "Person",
      labeledName: "Unit1"
    },
    {
      name: "Phill",
      age: 23.0,
      label: "Animal",
      labeledName: "Unit2"
    }
  ] as input // though you would typically pass this as a map parameter
CREATE (n)
WITH input, n
CALL apoc.create.addLabels(n, [input.label]) YIELD node
SET n += apoc.map.removeKeys(input, ['label', 'labeledName'])
WITH collect([input.labeledName, n]) as pairs
WITH apoc.map.fromPairs(pairs) as mapping
...

С этим сопоставлением вы можете искать значение по ключу: mapping['Unit2'] даст вам соответствующийузел, и передаваемая вами строка может быть динамической из строковой переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...