首页 > 解决方案 > 即使 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
}

即使整个查询不完整,我如何修改查询以返回所有步骤?是否存在任何替代解决方案?

标签: javascriptnode.jsazure-cosmosdbgremlintinkerpop

解决方案


使用此示例数据:

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:[]]

推荐阅读