gpt4 book ai didi

neo4j - 如何将密码查询中的多个节点的数据返回到单个 graphql 字段?

转载 作者:行者123 更新时间:2023-12-05 03:05:26 24 4
gpt4 key购买 nike

一段时间以来,我一直在尝试一些变通方法,以便将正确的结果从 Neo4j 查询返回到 graphql。

让我们以搜索查询为例:

search: {
args: {
term: { type: GraphQLString }
},
type: new GraphQLList(NodeType),
resolve(parentValue, { term }, ctx) {
let params = { term };
let query = "MATCH(n:node) WHERE n.name CONTAINS { term } RETURN DISTINCT n.name, LABELS(n), n.userID, ID(n);";
return session.run(query, params)
.then( result => {
const record = result.records;
return record.map(function (data) {
return {
name: data.get('n.name'),
id: data.get('ID(n)').low,
userID: data.get('n.userID'),
label: data.get('LABELS(n)')[0]
}
})
})
}
}

这会毫无问题地返回在其名称属性中包含特定字符串值的所有节点。但是,如果您在 Neo4j 查询中描述更多节点,如何将相同的属性返回到单个 GraphQL 字段?例如,当您添加可选匹配时:

MATCH(n:node) 
WHERE n.name CONTAINS { term }
OPTIONAL MATCH (n)-[:nodeOf]-(b)
RETURN DISTINCT n.name, LABELS(n), n.userID, ID(n);

在这里你需要从两个节点返回数据,nb。我试图将路径设置为一个变量:

OPTIONAL MATCH p=(n)-[:nodeOf]-(b)

但后来我遇到了无法获取某些数据的问题,例如 this question 中的长度.

因此,如果您有一个描述两个节点的查询,例如 (a)-[r]-(b),那么您如何返回两个 a.nameb.name 到这个单一的 GraphQL 对象类型的 name 字段?

这是 NodeType 的简单版本:

const NodeType = new GraphQLObjectType ({
name: 'Node',
fields: () => ({
id: { type: GraphQLInt },
userID: { type: GraphQLInt },
name: { type: GraphQLString},
label: { type: GraphQLString },
depth: { type: GraphQLInt },
})
});

最佳答案

如果我理解你的问题,你可以这样做:

MATCH(n:node) 
WHERE n.name CONTAINS { term }
OPTIONAL MATCH (n)-[:nodeOf]-(b)
WITH collect({name : n.name}) + collect({name : b.name}) AS allNodes
UNWIND allNodes AS node
RETURN node

在此查询中,我是 collecting a.nameb.name 在同一集合中 (allNodes)。然后,我正在使用 UNWIND将列表转换回单独的行。

关于neo4j - 如何将密码查询中的多个节点的数据返回到单个 graphql 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50980270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com