【问题标题】:How to use Clauses with API REST Neo4J?如何在 API REST Neo4J 中使用子句?
【发布时间】:2017-12-20 21:23:59
【问题描述】:

我有一个在 Neo4j 浏览器中完美运行的复杂请求,我想通过 API Rest 使用它,但是有一些子句我无法处理。

语法如下:

匹配 p=()-[*]->(node1)

在哪里……

有...

....

FOREACH … 设置 …

按照@cybersam 的建议,我使用 Transactional Cyper 构建了查询,但无论如何我都无法使用多个子句。

举个例子,如果我将语句写在一行中:

    :POST /db/data/transaction/commit {

    "statements": [
    {
       "statement": "MATCH p = (m)-[*]->(n:SOL {PRB : {PRB1}}) WHERE nodes (p) 
MATCH q= (o:SOL {PRB : {PRB2}} RETURN n, p, o, q;",

 "parameters": {"PRB1": "Title of problem1", "PRB2": "Title of problem2"}
    }   ],   

"resultDataContents": ["graph"] }

我会得到:

{"results":[],"errors":[{"code":"Neo.ClientError.Statement.SyntaxError","message":"无效输入 'R': 预期的空白,注释,')'或关系模式(第 1 行,第 90 列(偏移量:89))\r\n\"MATCH p = (m)-[*]->(n:SOL {PRB : {PRB1}}) WHERE 节点(p ) MATCH q= (o:SOL {PRB : {PRB2}} 返回 n, p, o, q;\"\r\n ^"}]}

但如果我把它放在几行,:

 :POST /db/data/transaction/commit {

 "statements": [
    {
      "statement": "MATCH p = (m)-[*]->(n:SOL {PRB : {PRB1}})
 WHERE nodes (p) 
 MATCH q= (o:SOL {PRB : {PRB2}} 
 RETURN n, p, o, q;",

"parameters": {"PRB1": "Title of problem1", "PRB2": "Title of problem2"}
    }
  ],

  "resultDataContents": ["graph"]
}

据说:

{"results":[],"errors":[{"code":"Neo.ClientError.Request.InvalidFormat","message":"Unable 反序列化请求:非法的未引用字符((CTRL-CHAR,代码 10)):必须使用反斜杠转义才能包含在字符串中 [来源:HttpInputOverHTTP@41fa906c;行:4,列: 79]"}]}

拜托,我需要你的帮助!

亚历克斯

【问题讨论】:

    标签: rest neo4j cypher


    【解决方案1】:

    使用 Transaction Cypher HTTP API,您可以将相同的 Cypher 语句传递给 API。

    引用this section of the doc,这里有一个最简单的例子:

    在一个请求中开始并提交事务如果不需要 跨多个 HTTP 请求保持事务打开,您可以开始一个 事务、执行语句和只用一个 HTTP 提交 请求。

    示例请求

    • 发布http://localhost:7474/db/data/transaction/commit
    • 接受:application/json; charset=UTF-8
    • 内容类型:application/json

      {
        "statements" : [ {
          "statement" : "CREATE (n) RETURN id(n)"
        } ]
      }
      

    示例响应

    • 200:好的
    • 内容类型:application/json

      {
        "results" : [ {
          "columns" : [ "id(n)" ],
          "data" : [ {
            "row" : [ 6 ],
            "meta" : [ null ]
          } ]
        } ],
        "errors" : [ ]
      }
      

    【讨论】:

    • 那么我应该将请求的每个部分划分为一个特定的语句吗?这些陈述如何联系在一起并与分析的数据联系起来?
    • 您传递了整个语句(在您的示例中,您只有一个,由多个子句组成)。
    • 使用事务密码,当我使用多个子句时它也不起作用。阅读上面这个问题的升级...
    • 您需要修复您的 Cypher 代码。它有许多语法问题。 WHERE 子句需要计算为布尔值。您试图测试的 WHERE 子句是什么?此外,您在第二个 MATCH 子句末尾缺少右括号。在将 Cypher 与 API 一起使用之前,请使用 neo4j 浏览器或在console.neo4j.org 测试您的 Cypher。最后,您应该避免尝试在同一语句中执行 2 个不相关的查询,因为这会导致 cartesian product
    • 您的建议帮助我找出了我遇到的问题。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    相关资源
    最近更新 更多