Node.js 在Neo4j中,如何使用graphql将生成查询后获得的键值对存储到另一个现有节点中?
我正在nodejs中使用neo4j3.2和graphql。我有两种类型的“学校”和“班级”,关系如下:Node.js 在Neo4j中,如何使用graphql将生成查询后获得的键值对存储到另一个现有节点中?,node.js,neo4j,graphql,Node.js,Neo4j,Graphql,我正在nodejs中使用neo4j3.2和graphql。我有两种类型的“学校”和“班级”,关系如下: (学校)-[:has]->(班级)//一所学校可以有多个班级。 neo4j中的数据结构和关系与以下类似: School{ id: 001, label: "School A"}-[:has]->Class{ id: 001, label: "Class 1"} School{ id: 001, label: "School A"}-[:has]->Class{ id: 002, l
(学校)-[:has]->(班级)//一所学校可以有多个班级。
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"}
我试图做的是提取特定学校的班级数量,并将此计数值(作为属性)存储/附加到现有的第三种类型“SchoolData”中,该类型与“school”类型具有以下关系<代码>(学校数据)-[:of]->(学校)。因此,如上例所示,班级计数即2需要存储在学校A.i.e.的“学校数据”中
(SchoolData{ classCount: 2, label: "School A", otherInfo: "Already exisiting values are present here" })-[:of]->(School { id: 001, label: "School A"})
我已经做了一个变异,但是通过cypher生成count后返回的数据没有存储在节点“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返回的对象“数据”。全部:
data:{
classCount: [ Integer { low: 2, high: 0 } ],
label: [ 'School A' ]
}
//已解决的最终查询(表格部分):
这是“学校数据”的输出:
我认为您可能需要将第一个查询返回的值转换为JavaScript
Number
,然后在第二个查询中将其作为参数传递:
return record.get('c').toInt()
JavaScript Neo4j驱动程序使用自定义的Integer
对象来表示整数,因为JavaScript中没有Int
类型
能否在catch中添加
console.log(e)
,以便查看发生的任何错误?当getDBSession(sessionData).run(saveQuery,params)
返回的承诺解析时,生成的对象是什么样子的?它将变为null,并且没有为schoolData节点追加任何属性。顺便说一句,非常感谢你的努力。真的很可观!我在catch块中添加了console.log(e)并返回以下错误:“Neo4jError:需要一个名为data的参数。”啊。您正在传递params
对象,但看起来params
没有数据的值。因此,在执行saveQuery
之前,您需要像params['data']=data
这样的东西,它总是以一个闪亮盔甲中的救世主的形象出现:)…再次感谢..我还添加了只返回对象的第一个元素的逻辑(以避免将所有键值作为数组返回)。我已经更新了代码。希望它能帮助像我一样流浪的人。。再次感谢威廉和丹尼尔的帮助。一个gr8天!
{
"classCount": 2,
"label": "School A"
"otherInfo": "Details of relevant school..."
}
return record.get('c').toInt()