【发布时间】:2016-02-26 20:35:30
【问题描述】:
场景是这样的:我有一个包含项目的 ArangoDB 集合,以及另一个包含标签的集合。我正在使用图表,并且我有一个名为“包含”的边缘集合连接项目和标签。一个项目有多个标签。
现在我正在尝试搜索包含多个标签的项目。例如。包含标签“photography”、“portrait”和“faces”的项目。
我的一般方法是从每个标签顶点开始一个图遍历,并找到与该标签相关的项目。那部分工作正常。我得到一个项目列表。
但我任务的最后一部分是对所有列表进行交集,以便找到包含所有指定标签的项目。而且我不知道该怎么做。
我想做的是这样的:
let tagnames = SPLIT(@tagnames,',')
let tagcollections = (
FOR tagname IN tagnames
LET atag = (FOR t IN tags FILTER LOWER(t.text)==LOWER(tagname) RETURN t)
let collections = (FOR v IN 1..1 INBOUND atag[0] Contains RETURN v)
RETURN { tag: atag, collections: collections }
)
RETURN INTERSECTION(tagcollections)
但是,它不起作用:INTERSECTION 函数不适用于单个列表,而是适用于多个项目,例如:INTERSECTION(listA, listB, listC...)。
如何使 FOR .. RETURN 块中的列表相交?
【问题讨论】:
-
如果您有一个列表数组并且想要获取交集,您可能需要使用 APPLY() 来展开数组并将每个列表作为单独的参数传递:
APPLY("INTERSECTION", [listA, listB, listC])。它与INTERSECTION(listA, listB, listC)相同,但输入数组可以具有可变长度。 -
我认为您的评论是我一直在寻找的答案。尽管其他 cmets 非常有用,但您的回答直接回答了我的问题。但是当它是评论时,我无法将其标记为正确答案...
-
我发布了一个扩展答案:stackoverflow.com/a/38484463/2044940 如果它解决了您的问题,请接受并投票,谢谢!