[英]How to write a SPARQL query for retrieving data from OWL file
我已經使用Protege生成了一個貓頭鷹文件。 現在,我希望訪問所有從它一類火車站有所有實例的stationCode屬性值。
我的OWL文件包含以下格式
<?xml version="1.0"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:swrlb="http://www.w3.org/2003/11/swrlb#"
xmlns:xsp="http://www.owl-ontologies.com/2005/08/07/xsp.owl#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:protege="http://protege.stanford.edu/plugins/owl/protege#"
xmlns:swrl="http://www.w3.org/2003/11/swrl#"
xmlns:swrla="http://swrl.stanford.edu/ontologies/3.3/swrla.owl#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:sqwrl="http://sqwrl.stanford.edu/ontologies/built-ins/3.4/sqwrl.owl#"
xmlns="http://www.owl-ontologies.com/RailwaysSemantic.owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xml:base="http://www.owl-ontologies.com/RailwaysSemantic.owl">
<owl:Ontology rdf:about="">
<owl:imports rdf:resource="http://swrl.stanford.edu/ontologies/3.3/swrla.owl"/>
<owl:imports rdf:resource="http://sqwrl.stanford.edu/ontologies/built-ins/3.4/sqwrl.owl"/>
</owl:Ontology>
<rdfs:Class rdf:ID="BusStand"/>
<rdfs:Class rdf:ID="Eatery"/>
<rdfs:Class rdf:ID="Train"/>
<rdfs:Class rdf:ID="Hospital"/>
<rdfs:Class rdf:ID="City"/>
<rdfs:Class rdf:ID="RailwayStation"/>
<rdfs:Class rdf:ID="Airport"/>
<rdfs:Class rdf:ID="TouristSpot"/>
<rdfs:Class rdf:ID="Schedule"/>
<RailwayStation rdf:ID="RailwayStation_YPR">
<stationCode rdf:datatype="http://www.w3.org/2001/XMLSchema#string">
YPR</stationCode>
</RailwayStation>
為此,我該如何編寫SPARQL查詢?
我當前的查詢是這樣的:
String querystr = "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>"+
"PREFIX owl:<http://www.w3.org/2002/07/owl#>"+
"PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>"+
"SELECT * WHERE {"+
"?RailwayStation stationCode ?x ."+
"}";
但是它給出了這樣的異常:
Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Lexical error at line 1, column 194. Encountered: " " (32), after : "stationCode"
at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.perform(ParserSPARQL11.java:111)
at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.parse$(ParserSPARQL11.java:53)
at com.hp.hpl.jena.sparql.lang.SPARQLParser.parse(SPARQLParser.java:37)
at com.hp.hpl.jena.query.QueryFactory.parse(QueryFactory.java:148)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:80)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:53)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:41)
at org.iiitb.jena.Main.sprqltest(Main.java:70)
at org.iiitb.jena.Main.main(Main.java:22)
“?RailwayStation stationCode?x。”
該屬性必須是URI(具有<>)或前綴名稱(具有冒號)。
您的文件和查詢存在一些問題。 首先,您必須知道,當在xml / rdf文件中聲明base
名稱空間時,所有不帶特定名稱空間的標記都將添加到您的基本名稱空間http://www.owl-ontologies.com/RailwaysSemantic.owl
。 但是在您的情況下,我認為Protege為您創建了該命名空間。 關於文件,在基本名稱空間的末尾添加# or /
。
最后,對於您的查詢:添加前綴PREFIX base: <http://www.owl-ontologies.com/RailwaysSemantic.owl#>
,就像您對rdf和rdfs所做的那樣...
此后,您希望訪問RailwayStation類的所有實例的所有stationCode屬性值,回答此問題的sparql查詢為:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX base: <http://www.owl-ontologies.com/RailwaysSemantic.owl#>
select *
where { ?s a <http://www.owl-ontologies.com/RailwaysSemantic.owl#RailwayStation> .
?s <http://www.owl-ontologies.com/RailwaysSemantic.owl#stationCode> ?o}
我在您的文件中對其進行了測試,並返回了良好的結果。 我故意不在查詢中使用名稱空間,因此您可以立即在數據中對其進行測試,而無需更改名稱空間;)
我們可以通過使用如下前綴來使其更具可讀性:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX base: <http://www.owl-ontologies.com/RailwaysSemantic.owl#>
select *
where { ?s base:RailwayStation .
?s base:stationCode ?o}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.