Передача наборов свойств и узлов в виде инструкции POST с KOA-NEO4J или BOLT

Я строю REST API, который подключается к экземпляру NEO4J. Я использую библиотеку koa-neo4j в качестве основы ( https://github.com/assister-ai/koa-neo4j-starter-kit). Я новичок во всех этих технологиях, но благодаря некоторой помощи с этого форума у ​​меня работает базовый функционал. Например, приведенный ниже код позволяет мне создать новый узел с меткой "метрика" и установить свойства name и dateAdded.

URL:

/metric?metricName=Test&dateAdded=2/21/2017

index.js

app.defineAPI({
    method: 'POST',
    route: '/api/v1/imm/metric',
    cypherQueryFile: './src/api/v1/imm/metric/createMetric.cyp'
});

createMetric.cyp"

CREATE (n:metric { 
    name: $metricName, 
    dateAdded: $dateAdded
}) 
return ID(n) as id

Однако я изо всех сил пытаюсь узнать, как я могу подойти к более сложным примерам. Как я могу справиться с ситуациями, когда я не знаю, сколько свойств будет добавлено при предварительном создании нового узла или когда я хочу создать несколько узлов в одном операторе post. В идеале я хотел бы иметь возможность передавать что-то вроде JSON как часть POST, которая будет содержать все узлы, метки и свойства, которые я хочу создать. Возможно ли что-то подобное? Я попытался использовать приведенный ниже запрос Cypher и передать строку JSON в теле POST, но это не сработало.

UNWIND $props AS properties
CREATE (n:metric)
SET n = properties
RETURN n

Будет ли лучше переключиться на Neo4j Rest API вместо протокола BOLT и инфраструктуры KOA-NEO4J. Исходя из моих исследований, я подумал, что лучше использовать BOLT, но я хочу иметь Rest API в качестве промежуточного слоя между моим передним и задним краями, поэтому я готов перейти, если это будет проще в долгосрочной перспективе.

Спасибо за помощь!

2 ответа

Решение

Ваш синтаксис Cypher плох в двух отношениях.

  1. UNWIND принимает в качестве аргумента только коллекцию, а не строку.
  2. SET n = properties законно только если properties это карта, а не строка.

Этот запрос должен работать для создания одного узла (при условии, что $props карта, содержащая все свойства, которые вы хотите сохранить во вновь созданном узле):

CREATE (n:metric $props)
RETURN n

Если вы хотите создать несколько узлов, этот запрос (по сути такой же, как у вас) должен работать (но только если $prop_collection это коллекция карт):

UNWIND $prop_collection AS props
CREATE (n:metric)
SET n = props
RETURN n

Я тоже столкнулся с трудностями при попытке передать сложные типы в качестве аргументов в neo4j, это связано с преобразованием типов между js а также cypher над bolt и мало что можно было сделать, кроме как решить проблему в официальном репозитории с драйвером JavaScript neo4j. koa-neo4j использует официальный драйвер под капотом.

Один из способов пойти по таким сценариям в koa-neo4j использует JavaScript для управления аргументами перед отправкой в ​​Cypher:

https://github.com/assister-ai/koa-neo4j

Также возможно дальнейшее манипулирование результатами запроса Cypher с помощью ловушки жизненного цикла postProcess:

https://github.com/assister-ai/koa-neo4j

Другие вопросы по тегам