簡體   English   中英

Jena Sparql僅返回實例的直接超類

[英]Jena Sparql only return direct superclass of instance

我正在Java中使用Penat作為推理機的Jena。 現在,我需要查詢特定URI的類,但是問題是我事先不知道它是什么樣的實例,什么樣的類層次結構,所以我不能使用過濾器選項。 使用時:

SELECT * WHERE {<" + uri + "> rdf:type ?x}

它返回所有超類。 此特定示例的層次結構如下:

-Thing
 -Person
  -Adult
 -Animal
  -Dog

每個類都有多個實例。 我不知道我要事先查詢哪種實例。 但是,例如,假設我要查詢類型為Dog的實例的URI。 它還將返回Animal and Thing。 但我只希望它還給Dog。 那可能嗎? 使用LIMIT 1僅返回直接超類。

使用Jena可以輕松實現這一目的,它提供了一個特殊的謂詞來查詢直接類型,因此可以在代碼中按以下方式生成查詢:

  "SELECT * { <" + ind + "> <" + ReasonerVocabulary.directRDFType + "> ?type }"

或直接在查詢中直接為此謂詞使用URI:

  SELECT * { <ind> <urn:x-hp-direct-predicate:http_//www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type }

還可以編寫效率不高但可移植的SPARQL查詢,該查詢將查詢直接類型:

  PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
  PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
  PREFIX owl: <http://www.w3.org/2002/07/owl#> 
  SELECT * { 
    <ind> rdf:type ?directType .
    FILTER NOT EXISTS {
      <ind> rdf:type ?type .
      ?type rdfs:subClassOf ?directType .
      FILTER NOT EXISTS {
         ?type owl:equivalentClass ?directType .
      }
    }
  }

如果沒有其他類型的個體是此類的子類,則該類是個體的直接類型。 但是直接類型可能具有等效的類。 為了處理這些情況,我們必須在查詢中使用雙重否定。 該查詢效率低下,因為它首先檢索個人的所有類型,然后過濾非直接類型的個人。 但是從好的方面來說,您可以將其與Jena之外的其他系統一起使用,該系統不提供專用的直接類型謂詞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM