首页 > 解决方案 > MATCH 命令,在 WHILE 中使用 $currentMatch 来停止遍历

问题描述

我想使用匹配遍历图,但是当某个节点未连接到另一个特定节点时停止遍历。

为了澄清,我有以下设置:

图的设置

我的目标是执行以下查询:

对于墙,请给我该墙的所有链接/深层属性,这些属性是与墙相同的提交的一部分,但前提是从属性到墙的完整路径是提交的一部分

这意味着,从提交 #21:0 开始,我进入墙 #30:0,为此我应该获得 0 个属性(请注意,属性 #34:0 未链接到提交 #21:0!),同时开始从提交 #22:0 开始,将转到墙 #29:0,为此我应该获得所有 4 个属性。基本上我想在MATCH命中未连接到指定提交节点的节点时停止遍历。

我尝试了一个MATCH命令,while其中我检查是否有shortestPath从提交到$currentMatch. 但是,这似乎不起作用,我收到 Vertex ID 不能为 NULL 的错误。

我的查询是这样的:

select expand(ret) from (
    MATCH {class: V, as: commit, where:(@rid = #21:0)},
    {as: commit}.out("commitlink"){as: wall, where:(@class INSTANCEOF "Wall")},
    {as: wall}.out("E"){as: props, where:(@class = "Property"), while:(shortestPath($matched.commit, $currentMatch, "OUT","commitlink").size() > 0)}
  return items as ret)

...但请注意,此查询给出了“顶点 ID 不能为空”错误。

我似乎误解了$currentMatch命令while部分的可用性。

编辑:这似乎可以完成工作:

select expand($properties) LET 
$commit = (SELECT FROM #22:0),
$wall = (SELECT FROM (SELECT expand(out("commitlink")) FROM $commit) WHERE 
@class INSTANCEOF "Wall"),
$properties = (SELECT FROM (TRAVERSE OUT("E") FROM $wall WHILE (shortestPath($commit, @rid, "OUT", "commitlink").size() > 0)) WHERE @class INSTANCEOF "Property")

但是使用遍历查询而不是 MATCH 有缺点吗?

标签: orientdborientdb2.2

解决方案


我不知道我是否得到你想要的,但我的理解是你的查询应该返回所有直接连接到提交顶点的属性,中间没有墙,对吗?

如果这是你想要的,试试这个:

MATCH {class: Property, as: props}.in("commitlink"){as: commit, where:(@rid = #19:0)} return props

这是我的架构:

在此处输入图像描述

这是结果:

在此处输入图像描述

希望它有帮助

问候


推荐阅读