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>}";
私の問題は、結果をフィルタリングしたいときに始まります。スペインの geographicSubregion であるすべての都市のみが必要だとします。最初に、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>) . }";
国内のすべての都市を取得するクエリを作成する方法を知っている人はいますか?