如何正确获取从数据库查询返回的这些记录的值?

时间:2018-01-04 02:47:45

标签: javascript node.js neo4j graphql

我一直在想这个问题很长一段时间。我以前做过一些可疑的问题来解决这个问题。但我现在不知道如何使用Graphql。让我告诉你我的意思。

我有一个数据库查询返回以下内容:

{edges: COLLECT(DISTINCT {source: id(endNode(r)), target: id(startNode(r))})} 

返回的对象如下所示:

{ edges: [ { source: [Object], target: [Object] } }

接下来,源对象和目标对象如下所示:

[ { source: Integer { low: 38, high: 0 },
    target: Integer { low: 37, high: 0 } },

我只需要低值。为了实现这一目标,我一路走来:

.then(function (result) {
  return result.records.forEach (function (record) { 
    return record._fields[0].edges.forEach (function (a) { 
      return a.source.low
})})});

我试图在很长一段时间内以一种很好的方式解决这个问题。我花了几天时间试图找出这个未定义值的迷宫。但现在, 我需要从Graphql解析器中获取相同的id号。这就是解析器的部分内容:

.then(function (result) { return result.records.map(function (record) { return record.get("{edges: COLLECT(DISTINCT {source: id(endNode(r)), target: id(startNode(r))})}").edges })})

这将返回一个如下所示的对象数组:

[ { source: Integer { low: 38, high: 0 },
    target: Integer { low: 37, high: 0 } }]

这就是我被困住的地方。无论我怎么想,一切都回归未定义。我想在graphql中执行以下查询:{edges{source target}} 但Graphql甚至不会接近返回结果。

如果我尝试类似

的话
.then(...).edges.source

将返回未定义的值。我已经尝试了我能想到的每一个组合,但我似乎无法使Graphql查询这些id号,更不用说返回一个未定义的值。

我可以得到这样的结果:

var arr = [];
.then(function (result) {
   return result.records.forEach (function (record) {
      return record._fields[0].edges.forEach (function (a) {
         return arr.push({source: a.source.low, target: a.target.low})
    })})});

但我不知道如何将arr返回到graphql。

了解解析器功能。这就是用户查询的工作解析器:

user(_, { userID }) {
  let session = driver.session();
  let query = "MATCH (a:user) WHERE a.userID = toInteger$userID RETURN a;";
    return session.run(query, {userID})
      .then(function (result) { return result.records.map(function (record) { return record.get("a").properties })})

请帮我摆脱这个迷宫

修改

我想要创建的对象如下所示:

Object
links:
Array(22)
0:{source: 36, target: 44}
1:{source: 44, target: 45}
2:{source: 44, target: 46}
3:{source: 44, target: 48}
4:{source: 44, target: 47}
5:{source: 44, target: 53}
6:{source: 44, target: 62}
7:{source: 36, target: 52}
8:{source: 52, target: 58}
9:{source: 36, target: 54}
10:{source: 54, target: 56}
11:{source: 54, target: 55}
12:{source: 55, target: 63}
13:{source: 55, target: 60}
14:{source: 54, target: 61}
15:{source: 36, target: 49}
16:{source: 49, target: 59}
17:{source: 49, target: 50}
18:{source: 49, target: 51}
19:{source: 49, target: 65}
20:{source: 52, target: 57}
21:{source: 52, target: 64}
length:22
__proto__:Array(0)
nodes:(23) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
__proto__:Object

我已经拥有了节点,但是我真的很难为链接创建对象数组。链接数据的解析器如下所示:

const resolveFunctions = {
    Query: {
        nodes(_, {userID}) {
            let session = driver.session();
            let query = "MATCH p=(w) -[*]- () WHERE id(w) = toInteger($userID) UNWIND nodes(p) AS n UNWIND relationships(p) AS r WITH n, r ORDER BY n.Name RETURN n, {nodes: COLLECT(DISTINCT n), edges: COLLECT(DISTINCT {source: id(endNode(r)), target: id(startNode(r))})};";
            return session.run(query, {userID})
                .then(function (result) {
                    return result.records.map(function (record) {
                        return record.get("n").properties
                    })
                })
        },
    },
    Node: {
        source: (name, _) => {
            let session = driver.session();
            let params = {nameParam: name.Name};
            let query = "MATCH p=(w) -[*]- ()  WHERE w.Name = $nameParam UNWIND relationships(p) AS r WITH r RETURN r, COLLECT(DISTINCT toString(id(endNode(r)))) as s";
            return session.run(query, params)
                .then(function (result) {
                    return result.records.map(function (record) {
                        return record.get("s")
                    })
                })
        },
        target: (name, _) => {
            let session = driver.session();
            let params = {nameParam: name.Name};
            let query = "MATCH p=(w) -[*]- () WHERE w.Name = $nameParam UNWIND relationships(p) AS r WITH r RETURN r, COLLECT(DISTINCT toString(id(startNode(r)))) as t";
            return session.run(query, params)
                .then(function (result) {
                    return result.records.map(function (record) {
                        return record.get("t")
                    })
                })
        },
    },
};

module.exports = resolveFunctions;

这是架构。我只针对链接数据和嵌套查询尝试了不同的查询,如上所述。当我尝试仅对链接数据进行查询时,graphql将返回null。我记录了在解析器中返回的结果,它会根据需要显示数据。我不知道为什么,但graphql仍然返回null。

在更改Neo4j查询后,它有助于将id转换为字符串。但是.then(...)。edges.source.id / edges.source / edges.target都返回undefined。至少它比.edges.source.id.low

在下面的示例中,我设法获取查询中的数据。但现在它为每个节点返回4个id。只有一个目标id和一个源id应该与单个节点一起返回,而不是4.这可以通过提供不同的WHERE子句来解决吗?我试着再解决这个问题了一整天。我尝试了许多不同的Neo4j查询,并尝试以多种方式更改graphql架构。我缺乏经验,我只是一个初学者,但我很想弄清楚这一点。

type Node {
    id: Int
    Name: String
    user: User
    tag: String
    labels: String
    source: String
    target: String
}

type Query {
    nodes(id:Int): [Node]
}

2 个答案:

答案 0 :(得分:0)

您希望在working with numbers in javascript上查看此部分。 Neo4j的整数值是64位长值,但javascript无法解决这些问题,因此您需要使用链接部分中的技术来解决这个问题。

答案 1 :(得分:0)

简单的方法是使用密码将长整数转换为字符串:

{
    edges: COLLECT(DISTINCT {
        source: toString(ID(endNode(r))), 
        target: toString(ID(startNode(r)))
    })
}