簡體   English   中英

如何使用SPARQL查詢SUMO本體

[英]How to query SUMO ontology using SPARQL

我正在使用我想通過SPARQL查詢的SUMO本體。 SUMO中的一個典型條目(例如,一個城市)如下所示:

<owl:Thing rdf:ID="MadridSpain">
 <rdfs:isDefinedBy rdf:resource="http://www.ontologyportal.org/SUMO.owl"/>
 <rdf:type rdf:resource="#City"/>
 <owl:comment xml:lang="en">The City of Madrid in Spain.</owl:comment>
 <geographicSubregion rdf:resource="#Spain" />
 <externalImage rdf:datatype="xsd:anyURI">[...]</externalImage>
 <rdfs:label xml:lang="en">madrid spain</rdfs:label>
</owl:Thing>

如果要從本體中獲取所有城市,請使用以下示例查詢(效果很好):

String prefix = "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> "
              + "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>";
String rdq = prefix + "SELECT ?N ?O WHERE {?N rdf:type <http://www.ontologyportal.or/SUMO.owl#City>}";

當我想過濾結果時,我的問題就開始了。 假設我只想要屬於西班牙的地理區域的所有城市。 首先,我試圖通過分析Java和Jena中的所有結果來解決該問題,這花費了大量時間(每個結果5-10s,總共約10000個結果)。

Query myQuery = QueryFactory.create(rdq);
QueryExecution qexec = QueryExecutionFactory.create(myQuery, owlModel);
try {
 ResultSet results = qexec.execSelect();
 for (; results.hasNext();) {
  QuerySolution sol = results.nextSolution();
  Resource res = sol.getResource("N");
  StmtIterator it = res.listProperties();

  while(it.hasNext()){
   Statement state = it.next();
   //Doing some filtering
   System.out.println("predicate: " + state.getPredicate().toString());
   System.out.println("subject: " + state.getSubject().toString());
   System.out.println("object: " + state.getObject().toString());
  }
 }
}catch (Exception e) {
 e.printStackTrace();
 System.err.println("Query Error " + e.getMessage());
}

確保這不是真的有效,並且必須通過使用正確的查詢來以更簡單的方式存在。 但是目前,我仍在定義這樣的查詢。 我嘗試了以下方法,但沒有一個起作用。

SELECT ?N ?O WHERE { ?N rdf:type <http://www.ontologyportal.org/SUMO.owl#City> . 
 { SELECT ?N WHERE { (rdf:type ?b rdf:statement) .
 (rdf:Predicate ?b <http://www.ontologyportal.org/SUMO.owl#geographicSubregion>) .
 (rdf:Object ?b <http://www.ontologyportal.org/SUMO.owl#Spain>) } } }

SELECT ?N ?O WHERE { (rdf:statement ?b) .
 (rdf:Predicate ?b <http://www.ontologyportal.org/SUMO.owl#geographicSubregion>) . 
 (rdf:Object ?b <http://www.ontologyportal.org/SUMO.owl#Spain>) . }";

有人知道如何創建可查詢一個國家/地區中所有城市的查詢嗎?

我拿出了您提出的RDF,制作了一個可以查詢的最小RDF文件:

<rdf:RDF xmlns="http://www.ontologyportal.org/SUMO.owl#"
         xml:base="http://www.ontologyportal.org/SUMO.owl"
         xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
         xmlns:owl="http://www.w3.org/2002/07/owl#"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <owl:Thing rdf:ID="MadridSpain">
    <rdfs:isDefinedBy rdf:resource="http://www.ontologyportal.org/SUMO.owl"/>
    <rdf:type rdf:resource="#City"/>
    <owl:comment xml:lang="en">The City of Madrid in Spain.</owl:comment>
    <geographicSubregion rdf:resource="#Spain" />
    <externalImage rdf:datatype="xsd:anyURI">[...]</externalImage>
    <rdfs:label xml:lang="en">madrid spain</rdfs:label>
  </owl:Thing>
</rdf:RDF>

SPARQL是一種查詢語言,用於匹配RDF圖中的數據。 RDF圖中的邊是三元組 ,是主題謂詞賓語的簡單陳述。 您正在對一個三人組進行匹配。

?N rdf:type <http://www.ontologyportal.org/SUMO.owl#City>

如果您為sumo:定義前綴,那么您的查詢將更容易編寫,因此我們最終得到了(也將?N重命名為?city ):

prefix sumo: <http://www.ontologyportal.org/SUMO.owl#>
select ?city where { 
  ?city rdf:type sumo:City .
}

如您所見,它將選擇所有城市。 現在,您只需要匹配一個額外的三元組,因此我們將其添加到查詢中:

prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix sumo: <http://www.ontologyportal.org/SUMO.owl#>
select ?city where { 
  ?city rdf:type sumo:City .
  ?city sumo:geographicSubregion sumo:Spain .
}

為了使外觀更好看,可以使用兩個縮寫。 首先,在SPARQL中, rdf:type可以寫為a ,因為它是如此常見(然后我們也不需要定義前綴)。 其次,當您具有同一主題的多個三元組時,可以列出由分號分隔的謂詞對象部分。 我們最終以

prefix sumo: <http://www.ontologyportal.org/SUMO.owl#>
select ?city where { 
  ?city a sumo:City ;
        sumo:geographicSubregion sumo:Spain .
}

當我使用Jena的命令行工具針對上面的RDF運行此命令時,得到以下結果:

$ arq --data sumo.rdf --query query.sparql
--------------------
| city             |
====================
| sumo:MadridSpain |
--------------------

為什么其他查詢不起作用

您試圖在這種事情中做什么

(rdf:type ?b rdf:statement) .
(rdf:Predicate ?b <http://www.ontologyportal.org/SUMO.owl#geographicSubregion>) .
(rdf:Object ?b <http://www.ontologyportal.org/SUMO.owl#Spain>)

正在使用RDF修訂詞匯表。 首先,語法必須是

?b a rdf:Statement ;
   rdf:subject ?city ;
   rdf:predicate sumo:geographicSubregion ;
   rdf:object sumo:Spain .

為了匹配您需要回答的查詢表格的三元化形式。 但是,此查詢要求指定形式的圖中有四個三元組,而這些不在模型中。 僅僅因為圖中有一個三元組,並不意味着它的形式化。 (畢竟,由於還必須對用於驗證第一個三元組的所有三元組進行驗證,然后對那些三元組進行驗證,依此類推。)SPARQL僅允許您查詢數據中實際存在的三元組。

暫無
暫無

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

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