2017-02-21 25 views
2

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

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 

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

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

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

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

ответ

3

Ваш синаксис 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 
+0

Спасибо за ваш ввод. Я пробовал ваш код и передал следующий «props = [{metricName:« Test Name », dateCreated:« 02/21/2017 »}]», но я получаю сообщение об ошибке «Параметр, предоставляемый для создания узла, не является Map». Ясно, что я не правильно структурирую «карту» - любые указатели на это? – n4nite

+1

@ n4nite Параметр вашего реквизита должен быть картой, а значение, которое вы хотите использовать в своем запросе, должно быть записью на карте, значение которой представляет собой набор карт. Если мы используем пример киберсама, чтобы использовать параметр '$ prop_collection', ваши реквизиты должны быть:' props = {prop_collection: [{metricName: "Test Name", dateCreated: "02/21/2017"}] } ' – InverseFalcon

+0

Есть ли что-то, что я могу прочитать на картах в Neo4j, так как я не могу заставить это работать и не могу найти много, когда я ищу Google? Я использую примеры и передаю строку «реквизит» как часть моего заявления POST API, но я все еще получаю сообщение об ошибке «Параметр, предоставляемый для создания узла, не является Картой». – n4nite

1

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

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

https://github.com/assister-ai/koa-neo4j#preprocess-lifecycle

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

https://github.com/assister-ai/koa-neo4j#postprocess-lifecycle

+0

Hi Keyvan. Спасибо за ваши комментарии и отличную инфраструктуру Koa-Neo4j. Я новичок в Node, Koa и Neo4j, поэтому структура была фантастическим способом встать и работать. Как только я получу более компетентные навыки в области кодирования, я надеюсь внести свой вклад в рамки! – n4nite

+0

Cheers @ n4nite, я был бы более чем счастлив помочь с любыми проблемами, связанными с каркасом, которые могут возникнуть, просто [укажите проблему GitHub] (https://github.com/assister-ai/koa-neo4j/issues), если вы столкнулись с одним из них. Я рад видеть, что вы делаете классные вещи с помощью 'koa-neo4j'. – Keyvan

 Смежные вопросы

  • Нет связанных вопросов^_^