我一直在想这个问题很长一段时间。我以前做过一些可疑的问题来解决这个问题。但我现在不知道如何使用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]
}
答案 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)))
})
}