javascript - 即使 Gremlin 查询无法完成,如何返回遍历的所有步骤?
问题描述
我的问题如下:
我有一个图,其中包含标记为“用户”的顶点和它们之间对应于他们的家庭关系的边。两种类型的顶点是父用户和子用户。它们之间的边缘标签是“childOf”和“parentOf”。一个父母可以有多个孩子,但为简单起见,一个孩子只能有一个父母。我想创建一个 Gremlin 查询来获取特定父级的所有子级。我正在使用 CosmosDB 和 Node.js,所以查询如下所示:
(`g.V().has('userId', userId).has('isParent', isParent).outE('parentOf').inV().path()`, {
userId: userId,
isParent: true
})
这确实有效,并获得了所有子用户。当父用户确实存在并且它有一个或多个孩子时,我可以解析结果,并在场景中获得我想要的一切。
但是当父母没有孩子,或者父母根本不存在的情况下呢?这就是我在查询结束时开始使用“path()”标志的原因。如果有父级,并且确实有一个子级,则此查询将遍历三个步骤。第一个到达父顶点,第二个到达它们之间的边,第三个到达子顶点。
我的想法是,当我只有父母,但他们没有孩子时,这个查询将只返回一个步骤,即到达第一个顶点,即父母,然后不去任何其他步骤,因为不存在边和子顶点。这样我就可以解析结果,如果只有一个步骤,我可以使用该信息返回一条消息,表明父级确实存在,但没有任何子级。如果父节点甚至不存在,它将以零步返回,因为甚至没有一个顶点开始,我也可以使用该信息。
但真正发生的是,如果查询不能完全完成,所以没有外边(并且应该在它的末尾没有顶点)它不会返回发生的步骤,它只返回以下内容:
{
"_items": [],
"attributes": {
"x-ms-status-code": 200,
"x-ms-request-charge": 8.24,
"x-ms-total-request-charge": 8.24,
"x-ms-server-time-ms": 7.7629,
"x-ms-total-server-time-ms": 7.7629,
"x-ms-activity-id": "26c2ca5f-8479-4bab-b4f4-7fe6969d5e51"
},
"length": 0
}
即使整个查询不完整,我如何修改查询以返回所有步骤?是否存在任何替代解决方案?
解决方案
使用此示例数据:
g.addV('person').property('userId','x').as('x').
addV('person').property('userId','y').as('y').
addV('person').property('userId','z').as('z').
addE('parentOf').from('x').to('y').iterate()
你没有说你想要你的数据是什么形式,所以也许这对你有用:
gremlin> g.V().has('person','userId', 'x').
......1> project('parent','children').
......2> by('userId').
......3> by(out('parentOf').values('userId').fold())
==>[parent:x,children:[y]]
gremlin> g.V().has('person','userId', 'y').
......1> project('parent','children').
......2> by('userId').
......3> by(out('parentOf').values('userId').fold())
==>[parent:y,children:[]]
推荐阅读
- f# - F# + xUnit - 可能出什么问题
- android - Android Parsing XML 文件获取特定数据
- java - 检查字符串中的每个字符是否有效
- git - 在不使用 git config commit.gpgsign 的情况下签署 arc diff 提交
- php - PHP缺少输出/输出没有我期望的使用echo“邮件来自:
"; - 从以下位置输出邮件: - ruby-on-rails-5 - 通过 Rails 5 API 和 Active Storage 接受图像
- java - Android NSFileProviderExtension - 类似扩展
- php - 独立 Wamp 服务器 ssl 身份验证设置
- java - 如何开始调试 Github maven 项目
- r - 通过在多个列上排名来标记观察结果,同时考虑到关系