ArangoDB:搜索一个属性并过滤路径中的多个值
ArangoDB: Search for a property and filter multiple values in the path
我想展开并搜索具有特定标签的节点。但我还想用某个标签过滤路径的节点。
标签列包含 "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}
问题
- 过滤器在路径的所有节点上。我想在没有源和目标的路径上进行过滤。
- contains/or 部分真的很难看。有没有更好的方法来过滤多个值?
1) 对于 path.vertices[* LIMIT 1,LENGTH(path.vertices)-2]
,您将忽略顶点数组中的第一个(源)和最后一个(目标)条目。
2) 您可以在子查询中遍历搜索到的标签,并检查路径的顶点中是否存在标签。如果找到一个,则使用 LIMIT 1 RETURN 1
退出子查询,其中 returns 是一个长度为 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
作为绑定参数。因此,您可以在不更改查询的情况下扩展标签逻辑。
我想展开并搜索具有特定标签的节点。但我还想用某个标签过滤路径的节点。 标签列包含 "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}
问题
- 过滤器在路径的所有节点上。我想在没有源和目标的路径上进行过滤。
- contains/or 部分真的很难看。有没有更好的方法来过滤多个值?
1) 对于 path.vertices[* LIMIT 1,LENGTH(path.vertices)-2]
,您将忽略顶点数组中的第一个(源)和最后一个(目标)条目。
2) 您可以在子查询中遍历搜索到的标签,并检查路径的顶点中是否存在标签。如果找到一个,则使用 LIMIT 1 RETURN 1
退出子查询,其中 returns 是一个长度为 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
作为绑定参数。因此,您可以在不更改查询的情况下扩展标签逻辑。