удалить дубликаты сущностей из BaseX с помощью первичного ключа - PullRequest
0 голосов
/ 04 февраля 2020

Как мне удалить дубликаты записей?

В этом случае Twitter использует снежинку в качестве поля уникального идентификатора в JSON для твита, что отражено ниже. Создайте индекс твитов по идентификатору и удалите каждый дополнительный $tweet с дубликатом? Но как не закончить рекурсивным удалением каждого твита ...?

A simple FLWOR для печати идентификатора каждого твита в базе данных:

for $tweets  in db:open("twitter")
return <tweet>{$tweets/json/id__str}</tweet>

результаты:

thufir@dur:~/flwor/twitter$ 
thufir@dur:~/flwor/twitter$ basex tweetID.xq 
<tweet>
  <id__str>1224165280068382720</id__str>
</tweet>
<tweet>
  <id__str>1224160851797643264</id__str>
</tweet>
<tweet>
  <id__str>1224134565280862208</id__str>
</tweet>
...
<tweet>
  <id__str>1224016596634603520</id__str>
</tweet>
<tweet>
  <id__str>1224001430417297410</id__str>
</tweet>
<tweet>
  <id__str>1223987662094249991</id__str>
</tweet>thufir@dur:~/flwor/twitter$ 
thufir@dur:~/flwor/twitter$ 

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

Просто ищем общий план или подход. Я думаю о том, чтобы передать вывод из одного xquery в другой, но я застрял в том, как построить индекс. Предположительно, это функциональность, встроенная в саму базу данных , просто нужно использовать правильный модуль (, вероятно, ).

-

это выглядит чтобы вернуть другой результат, по крайней мере:

distinct-values(
    for $tweets in db:open("twitter") 
    return ($tweets/json/id__str))

, хотя я не совсем уверен, что это набор всех id__str значений.

1 Ответ

1 голос
/ 04 февраля 2020

Вы можете использовать group by в FLOWR для получения дубликатов. Это также должно быть быстрее, чем distinct().

for $tweets  in db:open("twitter")
let $id := $tweets/json/id__str
group by $id
return
  if (count($tweets) > 1)
  then (for-each(tail($tweets), function ($t) { (: remove from DB :) } ) 
  else () (: nothing to do :)

...