MATCH命令,在WHILE中使用$ currentMatch来停止遍历

时间:2018-05-24 06:57:46

标签: orientdb orientdb2.2

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

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

Setup of graph

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

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

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

我尝试了一个MATCH命令,其中while我在其中检查了shortestPath的提交是否有$currentMatch。但是,这似乎不起作用,我得到顶点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)

...但请注意,此查询会给出&#34;顶点ID不能为空&#34;错误。

我似乎误解了命令的$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有缺点吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

这是我的架构:

enter image description here

这是结果:

enter image description here

Hoope it help

此致