2

我正在构建一个连接到 NEO4J 实例的 REST API。我使用 koa-neo4j 库作为基础(https://github.com/assister-ai/koa-neo4j-starter-kit)。我是所有这些技术的初学者,但感谢这个论坛的一些帮助,我的基本功能正常工作。例如,下面的代码允许我创建一个带有标签“metric”的新节点并设置名称和 dateAdded 属性。

网址:

/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 查询并在 POST 正文中传递一个 JSON 字符串,但它不起作用。

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

我最好切换到 Neo4j Rest API 而不是 BOLT 协议和 KOA-NEO4J 框架。根据我的研究,我认为使用 BOLT 会更好,但我希望有一个 Rest API 作为我的前端和后端之间的中间层,所以如果从长远来看这会更容易,我愿意改变。

谢谢您的帮助!

4

2 回答 2

3

您的 Cypher 语法在几个方面不好。

  1. UNWIND只接受一个集合作为它的参数,而不是一个字符串。
  2. SET n = propertiesproperties仅当是地图而不是字符串时才合法。

此查询应该适用于创建单个节点(假设这$props是一个包含您要与新创建的节点一起存储的所有属性的映射):

CREATE (n:metric $props)
RETURN n

如果您想创建多个节点,则此查询(与您的基本相同)应该可以工作(但仅当$prop_collectionmaps 的集合时):

UNWIND $prop_collection AS props
CREATE (n:metric)
SET n = props
RETURN n
于 2017-02-21T20:38:10.750 回答
1

在尝试将复杂类型作为参数传递给 neo4j 时,我也遇到了困难,这与之间的类型转换有关,js除了cypher在官方neo4j JavaScript 驱动程序存储bolt库中提交问题外,没有什么可以做的。在引擎盖下使用官方驱动程序。koa-neo4j

处理这种情况的一种方法koa-neo4j是在发送到 Cypher 之前使用 JavaScript 来操作参数:

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

也可以使用 postProcess 生命周期钩子进一步操作 Cypher 查询的结果:

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

于 2017-03-04T01:31:45.500 回答