在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?