java如何编写SPARQL查询以从OWL文件检索数据
我已经使用Protege生成了一个owl文件。现在我希望从中访问类RailwayStation的所有实例的所有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)
# 1 楼答案
您的文件和查询存在一些问题。首先,您必须知道,当您在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查询是:
我在你的文件中测试了它,结果很好。我故意没有在查询中使用名称空间,因此您可以在数据中立即测试它,而无需更改名称空间;) 祝你好运
# 2 楼答案
属性必须是URI(具有<;>;)或前缀名称(带有冒号)
# 3 楼答案
我们可以使用前缀使其更具可读性,如下所示: