使用 KOA-NEO4J 或 BOLT 将属性和节点集作为 POST 语句传递

Passing sets of properties and nodes as a POST statement wit KOA-NEO4J or BOLT

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

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

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

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

感谢您的帮助!

您的 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 时也遇到了困难,这与 jscypher 之间的类型转换有关 bolt 并且没有除了在官方 neo4j JavaScript driver 回购中提出问题外,还有很多事情要做。 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