繁体   English   中英

ArangoDB 图遍历对不同的顶点类型使用不同的过滤器

[英]ArangoDB graph traversal with different filter for different vertex types

我需要能够按顶点类型过滤 arangodb 图遍历。 有两种顶点类型,比如说 vA 和 vB。 只有一种边,可以连接 _to 和 _from 任一类型的顶点。

vA 具有带有数值的属性“pfi”。 vB 有一个属性“别名”,它是几个属性/值对整数作为字符串的字典(文档):integer。 integer-as-string 属性包含与 vA 中的 pfi 属性相同类型的数据/数字。

我从每个起始顶点 p0(在查询的前面确定)开始。 每个 p0 都有属性“零点 id”和“pfi”。

我需要沿出站方向遍历,并且只保留 vA 类型的所有顶点都具有与 p0.pfi 匹配的“pfi”的路径,并且所有 vB 类型的顶点都具有与 pfi 匹配的“别名”属性。

FOR p0 in points
    FOR v, e, p IN 1..5 OUTBOUND p0['zero point id'] GRAPH 'grph'
        FILTER p.vertices[*]['pfi'] ALL == p0['pfi']
            OR p.vertices[*]['aliases'][TO_STRING(p0['pfi'])] NONE == null
        RETURN {
            'pfi': p0['pfi']
            , 'vertices': p.vertices
            , 'edges': p.edges
        }

我在上面尝试了几种语法变体,所有这些都具有相同的行为:如果我删除过滤器,我会得到所有(未过滤的)路径,而过滤器的结果是空的。 认为这是因为所有路径都包含两种顶点类型,并且 OR 的逻辑并不意味着任何一个条件都可以为任何单个顶点通过。

我该如何表达这一点,以便第一个条件适用于 vA 类型,第二个条件适用于 vB 类型?

我发现了这个: Filter on different graph edge types using ArangoDb AQL ,它可以适应

FOR p0 in points
    FOR v, e, p IN 1..5 OUTBOUND p0['zero point id'] GRAPH 'grph'
        LET counter = (
            FOR v2 in p.vertices
                FILTER v2['pfi'] == p0['pfi']
                    OR HAS(v2['aliases'], TO_STRING(p0['pfi']))
            RETURN v2
        )
        FILTER COUNT(counter) == COUNT(p.vertices)
RETURN {
    'pfi': p0['pfi']
    , 'edges': p.edges
}

它有效,但感觉就像一个笨拙的解决方法。 有没有更优雅的方式?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM