Sparql — условный вывод

Я очень новичок в семантической сети и sparql. У меня есть внутренняя онтология, использующая SmartLogic для управления данными.

Я пишу несколько простых запросов, чтобы начать.


PREFIX skos: <http://www.w3.org/2004/02/skos/core#> # Simple Knowledge Organization System - https://www.w3.org/2004/02/skos/
PREFIX skosxl: <http://www.w3.org/2008/05/skos-xl#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <https://www.w3.org/TR/rdf-schema/>
prefix owl: <http://www.w3.org/2002/07/owl#> 
prefix ap: <http://cv.ap.org/ns>

SELECT DISTINCT
           ?subjectPrefLabel  ?p ?o ?oL

         WHERE {

           {
             ?subject skosxl:prefLabel ?subjectLabel .
             ?subjectLabel skosxl:literalForm ?subjectPrefLabel .
             ?subject ?p ?o .
             OPTIONAL {?o skos:prefLabel ?oL} 

           }

           FILTER regex(?subjectPrefLabel, "Trump", 'i')


         } order by ?subjectPrefLabel

Этот запрос возвращает результаты, которые выглядят так:

введите здесь описание изображения

Я пытаюсь объединить поля ?o and ?oL, чтобы оно заменяло поле ?o тогда и только тогда, когда существует действительное поле ?oL

Я еще толком не разобрался. Если есть какие-либо предложения, пожалуйста, дайте мне знать.


person Busturdust    schedule 24.05.2017    source источник


Ответы (1)


Немного сложно без данных для тестирования запроса, но в SPARQL 1.1 можно использовать BIND(IF(condition,then,else) as ?result ):

PREFIX  skosxl: <http://www.w3.org/2008/05/skos-xl#>
PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  owl:  <http://www.w3.org/2002/07/owl#>
PREFIX  skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX  rdfs: <https://www.w3.org/TR/rdf-schema/>
PREFIX  ap:   <http://cv.ap.org/ns>

SELECT DISTINCT  ?subjectPrefLabel ?p ?o
WHERE
  { ?subject  skosxl:prefLabel    ?subjectLabel .
    ?subjectLabel
              skosxl:literalForm  ?subjectPrefLabel .
    ?subject  ?p                  ?o_tmp
    OPTIONAL
      { ?o_tmp  skos:prefLabel  ?oL }
    BIND(if(bound(?oL), ?oL, ?o_tmp) AS ?o)
    FILTER regex(?subjectPrefLabel, "Trump", "i")
  }
ORDER BY ?subjectPrefLabel
person UninformedUser    schedule 24.05.2017
comment
Спасибо, это работает и научило меня новому критическому механизму :) - person Busturdust; 25.05.2017