将一组属性和节点作为POST语句传递给KOA-NEO4J或BOLT

时间:2017-02-21 20:25:20

标签: node.js neo4j koa neo4j-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作为我的前端和后端之间的中间层,所以如果从长远来看这更容易,我愿意转换。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您的Cypher语法在某些方面很糟糕。

  1. UNWIND只接受一个集合作为其参数,而不是字符串。
  2. SET n = properties仅在properties是地图而非字符串时才合法。
  3. 此查询应该适用于创建单个节点(假设$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时,我也遇到了困难,这与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