SPARQL-запрос возвращает больше строк, чем ожидалось - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь преобразовать следующий RDF Turtle в CSV.Я просто хочу сохранить значения hasPlaceName, hasICAOcode и hasWKT для каждого объекта:

:Place_Oberschleissheim_Airport a :Civil_Aerodrome
 ;  :hasPlaceName "OBERSCHLEISSHEIM"
 ;    :hasICAOcode "EDNX"
 ;  :elevationOfPlace "487.68"^^unit:meters
 ;  :hasGeometry :geom_11_55916690826416_48_239166259765625
 ;  :Aerodrome_serves_City :City_OBERSCHLEISSHEIM
 .  :City_OBERSCHLEISSHEIM a :City
 .  :geom_11_55916690826416_48_239166259765625 a :Geometry
 ;  :hasWKT "POINT (11.55916690826416 48.239166259765625)" .

:Place_Oberschleissheim_Airport a :Civil_Aerodrome
 ;  :hasPlaceName "OBERSCHLEISSHEIM"
 ;    :hasICAOcode "EDMX"
 ;  :elevationOfPlace "487.68"^^unit:meters
 ;  :hasGeometry :geom_11_565555572509766_48_23805618286133
 ;  :Aerodrome_serves_City :City_OBERSCHLEISSHEIM
 .  :City_OBERSCHLEISSHEIM a :City
 .  :geom_11_565555572509766_48_23805618286133 a :Geometry
 ;  :hasWKT "POINT (11.565555572509766 48.23805618286133)" .

Это мой запрос SPARQL:

SELECT DISTINCT ?icao ?name ?wkt
WHERE {
    [] a :Civil_Aerodrome ;
        :hasPlaceName ?name ;
        :hasICAOcode ?icao ;
        :hasGeometry/:hasWKT ?wkt .
}

Но яполучаю четыре записи вместо двух:

(u'EDNX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.565555572509766 48.23805618286133)')
(u'EDMX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.565555572509766 48.23805618286133)')
(u'EDNX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.55916690826416 48.239166259765625)')
(u'EDMX', 'u'OBERSCHLEISSHEIM', 'u'POINT (11.55916690826416 48.239166259765625)')

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

1 Ответ

0 голосов
/ 24 сентября 2018

Ваш запрос SPARQL правильный, как и результат.Проблема в ваших данных.

Вы определили один ресурс аэропорта, :Place_Oberschleissheim_Airport.Однако вы даете этому единственному аэропорту два разных кода icao и два разных набора координат.

Затем вы задаете запрос, который запрашивает все различные комбинации icao, placename и наборы координат для любого аэропорта.Есть только один аэропорт, но у него есть два icaos и два набора координат, поэтому к вашему запросу есть четыре уникальных результата:

icao code 1, coordinate 1
icao code 2, coordinate 1
icao code 1, coordinate 2
icao code 2, coordinate 2

Решение состоит в том, чтобы ваши данные использовали разные идентификаторы для разных аэропортов.(или, в более общем случае, чтобы убедиться, что координаты и коды icao уникальны для каждого аэропорта).

В качестве альтернативы, если данные действительно должны оставаться такими, и вы хотите, чтобы ваш запрос возвращал уникальные результаты для аэропорта, вам нужно будет спросить себя, какую координату и какой код icao он должен вернуть.

Если ответ «просто выберите один из них, мне все равно, какой», вы можете сделать следующее

SELECT DISTINCT (SAMPLE(?icao) as ?code) ?name (sample(?wkt) as ?coord)
WHERE {
    ?airport a :Civil_Aerodrome ;
        :hasPlaceName ?name ;
        :hasICAOcode ?icao ;
        :hasGeometry/:hasWKT ?wkt .
} group by ?airport ?name

результат:

Evaluating SPARQL query...
+------------------------+------------------------+------------------------+
| code                   | name                   | coord                  |
+------------------------+------------------------+------------------------+
| "EDNX"                 | "OBERSCHLEISSHEIM"     | "POINT (11.55916690826416 48.239166259765625)"|
+------------------------+------------------------+------------------------+
1 result(s) (13 ms)

Если с другой сторонывы хотите вернуть оба, либо вы должны согласиться с тем, что вы получили еще несколько строк, либо вы можете объединить альтернативы в одну строку:

SELECT DISTINCT (GROUP_CONCAT(DISTINCT ?icao) as ?codes) ?name (GROUP_CONCAT(DISTINCT ?wkt) as ?coords)
WHERE {
    ?airport a :Civil_Aerodrome ;
        :hasPlaceName ?name ;
        :hasICAOcode ?icao ;
        :hasGeometry/:hasWKT ?wkt .
} group by ?airport ?name

результат:

Evaluating SPARQL query...
+------------------------+------------------------+------------------------+
| codes                  | name                   | coords                 |
+------------------------+------------------------+------------------------+
| "EDNX EDMX"            | "OBERSCHLEISSHEIM"     | "POINT (11.55916690826416 48.239166259765625) POINT (11.565555572509766 48.23805618286133)"|
+------------------------+------------------------+------------------------+
1 result(s) (2 ms)
...