ArangoDB:搜索属性并过滤路径中的多个值

时间:2017-03-29 08:09:47

标签: arangodb aql

我想进行扩展并搜索具有特定标签的节点。但我还想用特定标签过滤路径的节点。 标签栏包含的值类似于"实体;人物","实体;组织"

到目前为止我得到了什么

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. 包含/或部分非常难看。有没有更好的方法来过滤多个值?

1 个答案:

答案 0 :(得分: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}

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