Извлечение содержимого класса, такого как (onProperty, somevalueFrom, unioinOf (которые содержат коллекцию) и эквивалентный класс)

Я пытаюсь извлечь содержимое класса из файла owl, который состоит из onProperty и someValuesFrom, где someValueFrom состоит из класса, содержащего unionOf (onProperty, someValueFrom и эквивалентный класс), я создал запрос SPARQL для извлечения этих данных, однако каждый раз, когда он возвращает пустые узлы, такие как ":b0" и ":b1". Кто-нибудь знает, что мне делать с моим запросом, чтобы он дал необходимые результаты. Это мой файл совы:

<?xml version="1.0"?>
<rdf:RDF
    xmlns="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:ns0="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#"
    xml:base="http://owl.cs.manchester.ac.uk/2009/07/sssw/people">
  <owl:Ontology rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people"/>
  <owl:Class rdf:about="http://www.w3.org/2002/07/owl#Thing"/>
  <owl:Class rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#haulage_worker">
    <rdfs:comment rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
    ></rdfs:comment>
    <owl:equivalentClass>
      <owl:Restriction>
         <owl:onProperty>
          <owl:ObjectProperty rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#works_for"/>
        </owl:onProperty>
        <owl:someValuesFrom>
          <owl:Class>
            <owl:unionOf rdf:parseType="Collection">
              <owl:Restriction>
                <owl:onProperty>
                  <owl:ObjectProperty rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#part_of"/>
                </owl:onProperty>
                <owl:someValuesFrom>
                  <owl:Class rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#haulage_company"/>
                </owl:someValuesFrom>
               </owl:Restriction>
              <owl:Class rdf:about="http://owl.cs.manchester.ac.uk/2009/07/sssw/people#haulage_company"/>
            </owl:unionOf>
          </owl:Class>
         </owl:someValuesFrom>
      </owl:Restriction>
    </owl:equivalentClass>
    <rdfs:label rdf:datatype="http://www.w3.org/2001/XMLSchema#string"
    >haulage worker</rdfs:label>
  </owl:Class>
 </rdf:RDF>

и это мой запрос SPARQL, который я создал:

    prefix abc: <http://owl.cs.manchester.ac.uk/2009/07/sssw/people#>
    prefix ghi: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    prefix mno: <http://www.w3.org/2001/XMLSchema#>
    prefix owl: <http://www.w3.org/2002/07/owl#>
    prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    prefix list: <http://jena.hpl.hp.com/ARQ/list#>

    select distinct ?class ?ObjectProperty ?someValuesFrom ?otherClass where { ?class a  owl:Class .


    OPTIONAL{
       ?class owl:equivalentClass ?e .
        ?e a owl:Restriction .
#       ?e owl:onProperty ?ObjectProperty .
        ?e owl:someValuesFrom [ a owl:Class; 
                                    owl:unionOf [ rdf:first ?    ObjectProperty; 
                                    rdf:rest ?someValuesFrom ;     rdf:rest*/rdf:first ?otherClass]] .  


      }
     FILTER( STRSTARTS(STR(?class),STR(owl:)) || STRSTARTS(STR(?class),STR(abc:)))  
    }group by ?class  ?ObjectProperty ?someValuesFrom ?otherClass
    order by ?class

и это результат, который я получил:

-------------------------------------------------------------------------------
| class               | ObjectProperty | someValuesFrom | otherClass          |
===============================================================================
| abc:haulage_company |                |                |                     |
| abc:haulage_worker  | _:b0           | _:b1           | _:b0                |
| abc:haulage_worker  | _:b0           | _:b1           | abc:haulage_company |
| owl:Thing           |                |                |                     |
-------------------------------------------------------------------------------

но ожидаемый результат:

-----------------------------------------------------------------------------
| class               | ObjectProperty | someValuesFrom   | otherClass      |
=============================================================================
| abc:haulage_company |                |                  |                 |
| abc:haulage_worker  | abc:works_for  |                  |                 |
| abc:haulage_worker  | abc:part_of    | haulage_company  | haulage_company |
| owl:Thing           |                |                  |                 |
-----------------------------------------------------------------------------

Что мне делать с моим запросом SPARQL, чтобы вернуть этот результат?

Спасибо заранее :)


person Abdullah Almuhaimeed    schedule 25.10.2013    source источник
comment
Уважаемые все, я внес некоторые изменения в свой запрос SPARQL, которые изменили показанный результат, поэтому, если у кого-то есть идеи, что мне делать с моим запросом SPARQL, чтобы достичь ожидаемого результата, пожалуйста, помогите. Спасибо заранее   -  person Abdullah Almuhaimeed    schedule 27.10.2013
comment
Что именно вы пытаетесь вернуть? Из раздела ожидаемых результатов неясно, что должны представлять вторая и третья строки.   -  person Joshua Taylor    schedule 04.03.2014


Ответы (1)


Проблема с вашим запросом:

Возможно, будет легче понять результаты запроса SPARQL, если вы посмотрите на свои данные в сериализации Turtle, а не в сериализации RDF/XML. Соответствующая часть ваших данных:

ns0:haulage_worker  a        owl:Class ;
        rdfs:comment         ""^^xsd:string ;
        rdfs:label           "haulage worker"^^xsd:string ;
        owl:equivalentClass  [ a                   owl:Restriction ;
                               owl:onProperty      ns0:works_for ;
                               owl:someValuesFrom  [ a            owl:Class ;
                                                     owl:unionOf  ( [ a                   owl:Restriction ;
                                                                      owl:onProperty      ns0:part_of ;
                                                                      owl:someValuesFrom  ns0:haulage_company
                                                                    ] ns0:haulage_company )
                                                   ]

Рассмотрим совпадение для части о owl:unionOf. В вашем запросе это

owl:unionOf  ( [ a                   owl:Restriction ;
                 owl:onProperty      ns0:part_of ;
                 owl:someValuesFrom  ns0:haulage_company ]
               ns0:haulage_company )

Элементами списка являются пустой узел с некоторыми свойствами и ns0:haulage_company. Запрос, который должен соответствовать некоторым из этих данных:

owl:unionOf [ rdf:first ?ObjectProperty; 
              rdf:rest ?someValuesFrom ;
              rdf:rest*/rdf:first ?otherClass ]] .  

То, что будет соответствовать ?ObjectProperty, — это первый элемент списка, который в данном случае не является свойством объекта, а является пустым узлом. То, что будет соответствовать ?someValuesFrom, — это узел списка, представляющий остальную часть списка.

Исправление вашего запроса:

Я не совсем уверен, что именно вы пытаетесь вернуть из этого запроса. Основываясь на ваших ожидаемых результатах, похоже, вы говорите, что класс ?class может быть связан с ограничением owl:someValuesFrom, и в этом случае вы хотите связать ?ObjectProperty и ?someValuesFrom со свойством и классом объекта (если это не пустой узел), и в противном случае привязать ?otherClass к другим связанным (не пустым) классам. Вы сказали, что ожидали таких результатов:

-----------------------------------------------------------------------------
| class               | ObjectProperty | someValuesFrom   | otherClass      |
=============================================================================
| abc:haulage_company |                |                  |                 |
| abc:haulage_worker  | abc:works_for  |                  |                 |
| abc:haulage_worker  | abc:part_of    | haulage_company  | haulage_company |
| owl:Thing           |                |                  |                 |
-----------------------------------------------------------------------------

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

-----------------------------------------------------------------------------
| class               | ObjectProperty | someValuesFrom   | otherClass      |
=============================================================================
| abc:haulage_company |                |                  |                 |
| abc:haulage_worker  | abc:works_for  |                  |                 |
| abc:haulage_worker  | abc:part_of    | haulage_company  |                 |
| abc:haulage_worker  |                |                  | haulage_company |
| owl:Thing           |                |                  |                 |
-----------------------------------------------------------------------------

Вы можете сделать это с помощью такого запроса:

prefix :      <http://owl.cs.manchester.ac.uk/2009/07/sssw/people#>
prefix owl:   <http://www.w3.org/2002/07/owl#>
prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

select distinct ?class ?onProperty ?someValuesFrom ?otherClass where {
  #-- Select each named class.
  ?class a owl:Class .
  filter( !isBlank( ?class ))

  optional {
    #-- Find "related" classes by following a somewhat complex
    #-- property path that will follow equivalent classes,
    #-- existential restrictions, and unionOf expressions.
    ?class (owl:equivalentClass
           |owl:someValuesFrom
           |(owl:unionOf/rdf:rest*/rdf:first))+ ?r .

    #-- Save non-blank related classes as ?otherClass.
    bind(if(isBlank(?r),?unbound,?r) as ?otherClass)

    #-- If the related class is a restriction, then we can 
    #-- take its owl:onProperty and owl:someValuesFrom.
    optional { 
      ?r owl:onProperty ?onProperty ;
         owl:someValuesFrom ?svf .
      bind( if(isBlank(?svf),?unbound,?svf) as ?someValuesFrom )
    }
  }
}
values ?unbound { UNDEF }

Шаблон для сохранения значений, которые не привязаны к пустым узлам, описан в ответах на вопрос answer.semanticweb.com, Связать переменную только тогда, когда другая не является пустой? Идея состоит в том, чтобы использовать values ?unbound { UNDEF }, чтобы гарантировать, что ?unbound всегда имеет неопределенное значение, а затем использовать bind и if для присвоения либо ?unbound, либо какого-либо другого значения переменной. прогнозируемая переменная. По сути это так:

bind(if(isBlank(...),?unbound,...) as ...)
values ?unbound { UNDEF }

Результаты

-----------------------------------------------------------------------
| class            | onProperty | someValuesFrom   | otherClass       |
=======================================================================
| owl:Thing        |            |                  |                  |
| :haulage_company |            |                  |                  |
| :haulage_worker  |            |                  |                  |
| :haulage_worker  | :works_for |                  |                  |
| :haulage_worker  | :part_of   | :haulage_company |                  |
| :haulage_worker  |            |                  | :haulage_company |
-----------------------------------------------------------------------

Это включает строку для :haulage_worker, которая не имеет привязок ни к одной из других переменных, но я думаю, что это нормально, поскольку вам уже нужны такие строки для owl:Thing и :haulage_company.

person Joshua Taylor    schedule 05.03.2014
comment
Большое спасибо @Джошуа. Я попробовал ваш ответ, и он отлично работает. Извините за поздний ответ, думал проблема не решена. Я просто вижу решение - person Abdullah Almuhaimeed; 15.08.2014