Houngan
Houngan

Reputation: 27

How to use Clauses with API REST Neo4J?

I have a complexe request that perfectly works in Neo4j Browser that I want to use through API Rest, but there are Clauses I can't cope with.

The syntax looks like :

MATCH p=()-[*]->(node1)

WHERE …

WITH...

....

FOREACH … SET …

I constructed the query with Transactional Cyper as i have been suggested by @cybersam, but I don't manage to use more than one clause anyway.

To give an exemle, if I write the statement in one line :

    :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"] }

I shall obtain :

{"results":[],"errors":[{"code":"Neo.ClientError.Statement.SyntaxError","message":"Invalid input 'R': expected whitespace, comment, ')' or a relationship pattern (line 1, column 90 (offset: 89))\r\n\"MATCH p = (m)-[*]->(n:SOL {PRB : {PRB1}}) WHERE nodes (p) MATCH q= (o:SOL {PRB : {PRB2}} RETURN n, p, o, q;\"\r\n ^"}]}

But if I put it in several lines, :

 :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"]
}

it is said :

{"results":[],"errors":[{"code":"Neo.ClientError.Request.InvalidFormat","message":"Unable to deserialize request: Illegal unquoted character ((CTRL-CHAR, code 10)): has to be escaped using backslash to be included in string value\n at [Source: HttpInputOverHTTP@41fa906c; line: 4, column: 79]"}]}

Please, I need your help !

Alex

Upvotes: 0

Views: 144

Answers (1)

cybersam
cybersam

Reputation: 67019

Using the Transaction Cypher HTTP API, you could just pass the same Cypher statement to the API.

To quote from this section of the doc, here is an example of the simplest way to do that:

Begin and commit a transaction in one request If there is no need to keep a transaction open across multiple HTTP requests, you can begin a transaction, execute statements, and commit with just a single HTTP request.

Example request

  • POST http://localhost:7474/db/data/transaction/commit
  • Accept: application/json; charset=UTF-8
  • Content-Type: application/json

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

Example response

  • 200: OK
  • Content-Type: application/json

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

Upvotes: 1

Related Questions