在Neo4j中,我们如何使用graphql将生成查询后获得的键值对存储到另一个现有节点?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Neo4j中,我们如何使用graphql将生成查询后获得的键值对存储到另一个现有节点?相关的知识,希望对你有一定的参考价值。

我在nodejs中使用Neo4j 3.2和graphql。我有2种类型的“学校”和“班级”,关系如下:

(School)-[:has]->(Class)// 1 school can have multiple classes .

他们的数据结构以及neo4j中的关系类似于下面的那个:

School{ id: 001, label: "School A"}-[:has]->Class{ id: 001, label: "Class 1"}
School{ id: 001, label: "School A"}-[:has]->Class{ id: 002, label: "Class 2"}

我想要做的是拉出特定学校中存在的课程数量,并将此计数值(作为属性)存储/附加到已存在的第3类型“SchoolData”中,该类型与“学校”类型有以下关系。 (SchoolData)-[:of]->(School)。因此,从上面的例子中,类2的数量需要存储在学校A的“SchoolData”中,即

(SchoolData{ classCount: 2, label: "School A", otherInfo: "Already exisiting values are present here" })-[:of]->(School { id: 001, label: "School A"})

我做了一个变异,但是通过cypher生成计数后返回的数据没有存储在节点“SchoolData”中。有人可以让我知道为什么我会变空,我该怎么办?

这是我的graphql类型以及变异查询:

type SchoolData{
   classCount: Int
   label: String
   otherInfo: String
}
// mutation query
countThenAddIntoSchoolData( schoolID: String! ): SchoolData

这是我对graphql的解析器变异查询:

 countThenAddIntoSchoolData(_, params) {
  let classCount = `MATCH (s:School {id: $schoolID })-[:has]->(c:Class) return count(c) as c`;
  let label = `MATCH (s:School {id: $schoolID })-[:has]->(c:Class) return s.label as s`;


  let sessionData = {};
  return Promise.all([
      getDBSession(sessionData).run(classCount, params),
      getDBSession(sessionData).run(label, params)
    ]).then((result) => {
      let data = {
        classCount: result[0].records.map(record => {
          return record.get('c');
        }),
        label: result[1].records.map(record => {
          return record.get('s');
        })
      };
      return data; // till here, it works fine
    }).then((data) => {
      let saveQuery = `MATCH (sd:SchoolData)-[:of]->(s:School {id: $schoolID })
                        SET sd += $data `
      return getDBSession(sessionData).run(saveQuery, params);

    })
    .catch((e) => {

    });
}

注意:getDBSession已在我的另一个文件(database.js)中配置。

这是我从Promise.all返回的对象“data”:

    data:{ 
   classCount: [ Integer { low: 2, high: 0 } ],
   label: [ 'School A' ]
  }

//已解决的最终查询(可选部分):

    .then((data) => {

       params['data'] = {
         classCount: data.classCount[0],
         label: data.label[0]
       };
          let saveQuery = `MATCH (sd:SchoolData)-[:of]->(s:School {id: 
                           $schoolID })
                            SET sd += $data `
          return getDBSession(sessionData).run(saveQuery, params);

        })
        .catch((e) => {

        });
    }

以下是“SchoolData”的输出:

  {
   "classCount": 2,
   "label": "School A"
   "otherInfo": "Details of relevant school..."
  }

以上是关于在Neo4j中,我们如何使用graphql将生成查询后获得的键值对存储到另一个现有节点?的主要内容,如果未能解决你的问题,请参考以下文章

Neo4j 数据库、NestJS 框架和 GraphQL 如何集成?

如何使用 Django 和 Neo4j 数据库创建 GraphQL API?

Neo4j/GraphQL 增强模式

如何在我的 Graphql Schema 中表示 Neo4j 关系属性?

不懂Neo4j?没关系,先学增删改查

如何从 GraphQL 生成 Dart - graphql 到 dart 生成器