ArangoDB INTERSECTION () с повторением - PullRequest
0 голосов
/ 01 декабря 2018

Я попал в сценарий, в котором мне нужно найти пересечение двух массивов, чтобы иметь возможность подсчитать, сколько раз элемент встречается на пересечении.К сожалению, инструмент ArangoDB INTERSECTION () удаляет дубликаты.Кто-нибудь знает способ сохранить повторы без использования фильтра?Вот то, с чем я сейчас работаю.

FOR x in INTERSECTION ((
for v IN 2 ANY a1 GRAPH 'Graph1'
    COLLECT eid = v._id WITH COUNT into groups
    RETURN {"eid" : eid, "count" : groups }),(
for v IN 2 ANY a2 GRAPH 'Graph2'
    COLLECT eid = v._id WITH COUNT into groups
    RETURN {"eid" : eid, "count" : groups }))
SORT x.count DESC
LIMIT 10
RETURN x

Другая проблема (которая может быть корнем проблемы) заключается в том, что мне нужно пересечение, которое происходит только с eid, и в настоящее время он сравнивает и eid, исосчитать.Это означает, что если eid / 5 встречается 10 раз в первом наборе, а 8 раз - во втором, игнорируется.Однако, если я делаю подсчет после пересечения, все элементы возвращаются со счетом 1, потому что дубликаты были удалены.Помощь приветствуется.

1 Ответ

0 голосов
/ 13 декабря 2018

Я попробовал этот AQL, и он должен работать:

LET arA = (
for v IN 2 ANY a1 GRAPH 'Graph1'
    COLLECT eid = v._id WITH COUNT into groups
    RETURN {"eid" : eid, "count" : groups })
LET arB = (
for v IN 2 ANY a2 GRAPH 'Graph2'
    COLLECT eid = v._id WITH COUNT into groups
    RETURN {"eid" : eid, "count" : groups })
LET x = (FOR x in INTERSECTION (arA[*].eid,arB[*].eid)
 RETURN x)
FOR final IN UNION(arA,arB)
  FILTER final.eid IN x 
  SORT final.count DESC
RETURN final

, в основном массивы подсчитываются отдельно, затем вы делаете пересечение, чтобы получить EID, которые находятся в обоих массивах.

Но затем, отдельно, с помощью UNION, снова итерируем все элементы, фильтруя только те из них, которые находятся в INTERSECTION, и сортируем их по атрибуту f.count.Атрибут count теперь доступен, потому что у меня есть записи из обоих исходных массивов, отфильтрованные по eid, представленному в INTERSECTION.

И результаты:

[
  {
    "eid": "eid6",
    "count": 5
  },
  {
    "eid": "eid3",
    "count": 4
  },
  {
    "eid": "eid2",
    "count": 3
  },
  {
    "eid": "eid3",
    "count": 3
  }
]
...