0

onProperty と someValueFrom で構成されるフクロウ ファイルからクラスのコンテンツを抽出しようとしています。someValueFrom は、unionOf (onProperty、someValueFrom、および equalClass) を含むクラスで構成されています。これらのデータを抽出する 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 クエリをどうすればよいですか?

よろしくお願いします:)

4

1 に答える 1

1

クエリの問題:

RDF/XML シリアライゼーションではなく、Turtle シリアライゼーションでデータを見ると、SPARQL クエリの結果を理解しやすいかもしれません。データの関連部分は次のとおりです。

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 }

空白のノードにバインドされていない値を保存するパターンは、answers.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、他の変数のバインディングを持たない for の行が含まれますが、 および のような行が既に必要だったので、それで問題ないと思いowl:Thingます:haulage_company

于 2014-03-05T17:06:18.670 に答える