使用 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 语法在几个方面很糟糕。
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
并且没有除了在官方 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
我正在构建一个连接到 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 语法在几个方面很糟糕。
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
并且没有除了在官方 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