【问题标题】:ArangoDB: Search for a property and filter multiple values in the pathArangoDB:搜索属性并过滤路径中的多个值
【发布时间】:2017-03-29 17:55:53
【问题描述】:

我想进行扩展并搜索具有特定标签的节点。但我也想用某个标签过滤路径的节点。 标签列包含诸如“Entity;Person”、“Entity;Organization”之类的值

到目前为止我得到了什么

LET source = (FOR x IN Entity FILTER x.objectID == @nodeId
    Return x)[0]
FOR node, edge, path IN 1..@maxLength ANY source GRAPH @graph
        FILTER CONTAINS(node.label,  @search)
        AND node != source 
        AND (CONTAINS (path.vertices[*].label, "Person") OR CONTAINS (path.vertices[*].label, "Organization") OR CONTAINS (path.vertices[*].label, "Incident"))
        LIMIT @maxPaths
        RETURN {node,path}

问题

  1. 过滤器位于路径的所有节点上。我想过滤没有源和目标的路径。
  2. 包含/或部分真的很难看。有没有更好的方法来过滤多个值?

【问题讨论】:

    标签: arangodb aql


    【解决方案1】:

    1) 使用path.vertices[* LIMIT 1,LENGTH(path.vertices)-2],您将忽略顶点数组中的第一个(源)和最后一个(目标)条目。

    2) 您可以在子查询中遍历搜索到的标签,并检查路径的顶点中是否存在标签。如果找到一个,则使用 LIMIT 1 RETURN 1 退出子查询,它会返回一个长度为 1 的数组,否则你会得到一个长度为 0 的数组。然后你可以过滤这些长度。

    LET labels = ["Person","Organization","Incident"]
    
    FOR source IN Entity FILTER source.objectID == @nodeId
    LIMIT 1
    FOR node, edge, path IN 1..@maxLength ANY source GRAPH @graph
      FILTER CONTAINS(node.label,  @search)
      AND node != source
      AND LENGTH(FOR i IN labels
        FILTER CONTAINS(path.vertices[* LIMIT 1,LENGTH(path.vertices)-2].label, i)
        LIMIT 1
        RETURN 1) == 1
      LIMIT @maxPaths
      RETURN {node,path}
    

    Node:我会使用labels 作为绑定参数。因此,您可以在不更改查询的情况下扩展您的标签逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      相关资源
      最近更新 更多