我正在构建一个连接到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作为我的前端和后端之间的中间层,所以如果从长远来看这更容易,我愿意转换。
感谢您的帮助!
答案 0 :(得分:3)
您的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
答案 1 :(得分:1)
在尝试将复杂类型作为参数传递给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