Gremlin查询无法完成,如何return遍历所有步骤?
How to return all steps of traversal even if Gremlin query can not complete?
我的问题如下:
我有一个图表,其中包含标记为 'user' 的顶点和它们之间的边,这些边对应于它们的家庭关系。两种类型的顶点是 parent 用户和 child 用户。它们之间的边标签是'childOf'和'parentOf'。一个parent可以有多个children,但是为了简单起见,一个child只能有一个parent。我想创建一个 Gremlin 查询来获取特定 parent 的所有 children。我正在使用 CosmosDB 和 Node.js,因此查询如下所示:
(`g.V().has('userId', userId).has('isParent', isParent).outE('parentOf').inV().path()`, {
userId: userId,
isParent: true
})
这确实有效,并且获得了所有 child 用户。当 parent 用户确实存在并且它有一个或多个 children.
时,我可以解析结果,并在场景中获得我想要的一切
但是如果parent没有child仁,或者parent根本不存在呢?这就是为什么我开始在查询结束时使用 'path()' 标志。如果有一个parent,它确实有一个child,这个查询有三个遍历步骤。第一个去 parent 顶点,第二个去它们之间的边,第三个去 child 顶点。
我的想法是,当我只有parent,而他们没有child时,这个查询只会return一步,也就是去第一个顶点,即 parent,然后不进行任何其他步骤,因为不存在边和 child 顶点。这样我就可以解析结果,如果只有一个步骤,我可以将该信息用于 return 并显示 parent 确实存在但没有任何 children 的消息.如果 parent 甚至不存在,它会 return 零步,因为甚至没有一个顶点开始,我也可以使用该信息。
但真正发生的是,如果查询不能完全完成,那么就没有出边(并且应该在它的末尾没有顶点),它不会 return 执行以下步骤发生了,只是 return 以下内容:
{
"_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
}
即使整个查询不完整,我如何通过所有步骤将查询修改为 return?是否存在替代解决方案?
使用此示例数据:
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:[]]
我的问题如下:
我有一个图表,其中包含标记为 'user' 的顶点和它们之间的边,这些边对应于它们的家庭关系。两种类型的顶点是 parent 用户和 child 用户。它们之间的边标签是'childOf'和'parentOf'。一个parent可以有多个children,但是为了简单起见,一个child只能有一个parent。我想创建一个 Gremlin 查询来获取特定 parent 的所有 children。我正在使用 CosmosDB 和 Node.js,因此查询如下所示:
(`g.V().has('userId', userId).has('isParent', isParent).outE('parentOf').inV().path()`, {
userId: userId,
isParent: true
})
这确实有效,并且获得了所有 child 用户。当 parent 用户确实存在并且它有一个或多个 children.
时,我可以解析结果,并在场景中获得我想要的一切但是如果parent没有child仁,或者parent根本不存在呢?这就是为什么我开始在查询结束时使用 'path()' 标志。如果有一个parent,它确实有一个child,这个查询有三个遍历步骤。第一个去 parent 顶点,第二个去它们之间的边,第三个去 child 顶点。
我的想法是,当我只有parent,而他们没有child时,这个查询只会return一步,也就是去第一个顶点,即 parent,然后不进行任何其他步骤,因为不存在边和 child 顶点。这样我就可以解析结果,如果只有一个步骤,我可以将该信息用于 return 并显示 parent 确实存在但没有任何 children 的消息.如果 parent 甚至不存在,它会 return 零步,因为甚至没有一个顶点开始,我也可以使用该信息。
但真正发生的是,如果查询不能完全完成,那么就没有出边(并且应该在它的末尾没有顶点),它不会 return 执行以下步骤发生了,只是 return 以下内容:
{
"_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
}
即使整个查询不完整,我如何通过所有步骤将查询修改为 return?是否存在替代解决方案?
使用此示例数据:
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:[]]