Передача наборов свойств и узлов в виде инструкции 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 плох в двух отношениях.
UNWIND
принимает в качестве аргумента только коллекцию, а не строку.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: