Как удалить дубликаты пустых узлов - PullRequest
1 голос
/ 30 января 2020

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

Данные, о которых идет речь:

<http://faculty.washington.edu/tgis/ld/brumfield/uwDataset/places#NaroFominskiiraionMoskovskaia>
        a                        vra:AdministrativeArea ;
        rdfs:label               "Naro-Fominskii raion" ;
        uwext:typeOfAdminArea    "Raion" ;
        schema:containedInPlace  <http://faculty.washington.edu/tgis/ld/brumfield/uwDataset/places#MoskovskaiaoblastMoskovskaia> , <http://faculty.washington.edu/tgis/ld/brumfield/uwDataset/places#RussiaFederation> ;
        ns1:sameAs               <http://dbpedia.org/resource/Naro-Fominsky_District> ;
schema:geo
[ a                 schema:GeoCoord ;
  schema:latitude   "53.3793416" ;
  schema:longitude  "58.9708374"
],
[ a                 schema:GeoCoord ;
  schema:latitude   "53.3793416" ;
  schema:longitude  "58.9708374"
] .

Что я пробовал:

delete {?q a schema:GeoCoord.
?q schema:latitude ?lat .
?q schema:longitude ?long .  }
where
{
?s a schema:GeoCoord.
?s schema:latitude ?lat .
?s schema:longitude ?long .
?q a schema:GeoCoord.
?q schema:latitude ?lat .
?q schema:longitude ?long .
    filter(?q != ?s)
}

Это удаляет обе схемы: ресурсы GeoCoord. Как я могу удалить дубликат ресурса?

1 Ответ

2 голосов
/ 30 января 2020

Для этого есть хитрость. Используйте

 filter(str(?q) < str(?s))

вместо

 filter(?q != ?s) 

. Причина, по которой это работает, заключается в том, что если вы сравниваете с использованием !=, вы получаете два совпадения: после того, как все оба узла не равны друг другу. Однако только один идентификатор bnode меньше другого, поэтому вы получите только одно совпадение.

...