Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在Neo4j中,如何使用graphql将生成查询后获得的键值对存储到另一个现有节点中?_Node.js_Neo4j_Graphql - Fatal编程技术网

Node.js 在Neo4j中,如何使用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

我正在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, 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()