【发布时间】:2013-09-17 14:00:11
【问题描述】:
我正在使用我想用 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-10 秒,大约 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>) . }";
有人知道如何创建一个查询来获取一个国家/地区内的所有城市吗?
【问题讨论】:
-
您在这方面取得了进展吗?几年前我曾短暂接触过 SUMO,并不知道有 OWL 翻译,所以这很有趣。如果到目前为止的答案没有帮助,您还遇到了哪些其他问题?
-
您的解决方案效果很好,并且 +1 以获得最佳答案。
-
很高兴能帮上忙!正如我所说,我不知道 SUMO 的 OWL 翻译,所以这对我来说是一个好消息。感谢您的询问!