Как передать значение результата из одного оператора в другой в Neo4j - PullRequest
1 голос
/ 22 сентября 2019

У меня есть код ниже, где он запускает несколько операторов, Первое утверждение должно возвращать результат, который используется Второе утверждение , это вызов из приложения для Android .

return session.writeTransaction(wrte=>{
    let r : any

    if(context.auth){

  //This Statement returns ID of the node

      wrte.run('MATCH (p:Person{identity:{identity}}) CREATE (p)-[po:POST]->(a:Post{post:{post},userName:{userName}}) RETURN ID(a)', 
      {identity: context.auth.uid, post: data.post, userName: context.auth.token.name })

    }
   return r as neo4j.v1.StatementResult

  })

 //how to get the ID from the Last Statement

  .then((val) =>  session.readTransaction(read => {
    console.log(val.records[0].get(0))
    return read.run('MATCH  (p:Post) WHERE id(p) = {any} RETURN p',{any: val.records[0].get(0)})
  }))

.then(result => {
    session.close();      
    driver.close()
    console.log(result)
    var singleRecord = result.records[0]
    var dat = singleRecord.get(0)

    if(result.records[0] == null){

      return  null

    } else {
      return {

        "post": dat.properties.post,
        "userName":dat.properties.userName,
    }

    }

  }).catch(error => {
    session.close()
    console.log(error)
    driver.close()
    throw new functions.https.HttpsError(error,"some error");
  })
});

console.log(val.records[0].get(0)) возвращает неопределенное значение, как правильно передать результаты и как получить идентификатор?

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Мне просто нужно было return каждую транзакцию

Код:

return session.writeTransaction(wrte=>{
    let r : any

    if(context.auth){
      r = wrte.run('MATCH (p:Person{identity:{identity}}) CREATE (p)-[po:POST]->(a:Post{post:{post},userName:{userName}}) RETURN ID(a) AS id', 
           {identity: context.auth.uid, post: data.post, userName: context.auth.token.name  })
    }

   return r as neo4j.v1.StatementResult
  }

)

  .then((r) => {
    return session.readTransaction(tx =>
      tx.run('MATCH  (p:Post) WHERE id(p) = {v} RETURN p',{v: r.records[0].get(0)})
    )

    .then(result => {
      session.close();      
      driver.close()
      var singleRecord = result.records[0]
      var dat = singleRecord.get(0)

      if(result.records[0] == null){

        return  null
        //response.send(false) 
      } else {
        return {

          "post": dat.properties.post,
          "dateTime":dat.properties.dateTime
      }
        //response.send(true) 
      }
    }).catch(error => {
      session.close()
      console.log(error)
      driver.close()
      throw new functions.https.HttpsError(error,"some error");
    })
  })
}
)
0 голосов
/ 25 сентября 2019

Ваш первый запрос может просто вернуть узел a, устраняя необходимость во втором запросе.Это было бы намного эффективнее.

Вместо этого:

MATCH (p:Person{identity:{identity}})
CREATE (p)-[po:POST]->(a:Post{post:{post},userName:{userName}})
RETURN ID(a) AS id`

сделайте это:

MATCH (p:Person{identity:{identity}})
CREATE (p)-[po:POST]->(a:Post{post:{post},userName:{userName}})
RETURN a
0 голосов
/ 23 сентября 2019

В своем заявлении Cypher вы написали RETURN ID(a).Поэтому ключ, к которому вам нужно получить доступ в StatementResult, называется ID(a).

Использовать val.records[0].get('ID(a)').

Примечание. Если вы используете псевдоним этого значения (например, RETURN ID(a) AS id), тогдавы будете делать val.records[0].get('id').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...