首页 文章

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

提问于
浏览
0

我在nodejs中使用Neo4j 3.2和graphql . 我有两种类型的“学校”和“ class ”,关系如下:

(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"中,该类型与"School"类型具有以下关系 . (SchoolData)-[:of]->(School) . 因此,从上面的例子来看, class 的数量,即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..."
  }

1 回答

  • 1

    我想你可能需要将第一个查询返回的Integer object转换为JavaScript Number ,然后在第二个查询中将其作为参数传递:

    return record.get('c').toInt()
    

    JavaScript Neo4j驱动程序使用自定义 Integer 对象来表示整数,因为JavaScript中没有 Int 类型 .

    您可以在捕获中添加 console.log(e) ,以便可以看到发生的任何错误吗?

相关问题