私はJena 3.1.0でSPARQLを試しています。私は、リソースリストから得られた各リソースから半径20km以内のリソースを見つけなければなりません。リソースの20km以内のものを見つけるためのSPARQL
このSPARQLクエリはclick meでした。 DBpediaエンドポイントで動作しますが、Javaでは動作しません。
ここに私のコードです。
public class SKPQSearch {
static Model model = getTestModel();
public static char quotes = '"';
public static boolean USING_GRAPH = false;
public static void main(String[] args) {
List<Resource> interestObject = new ArrayList<Resource>();
List<Resource> features = new ArrayList<Resource>();
interestObject = searchObjectofInterest("Hotel");
features = findFeatures(interestObject);
Iterator<Resource> it = features.iterator();
System.out.println("Features.....\n\n");
while (it.hasNext()) {
System.out.println(it.next().getURI());
} }
public static Model getTestModel() {
Model model = ModelFactory.createDefaultModel();
return model;
}
public static List<Resource> findFeatures(List<Resource> interestSet) {
List<Resource> featureSet = new ArrayList<>();
String serviceURI = "http://dbpedia.org/sparql";
for (int a = 0; a < interestSet.size(); a++) {
String queryString = "" + Sparql.addService(USING_GRAPH, serviceURI)
+ "SELECT DISTINCT ?resource WHERE { <" + interestSet.get(a).getURI()
+ "> geo:geometry ?sourcegeo." + " ?resource geo:geometry ?location ;" + "rdfs:label ?label ."
+ "FILTER(bif:st_intersects(?location, ?sourcegeo, 20))." + "FILTER(lang(?label) =" + quotes
+ "en" + quotes + ")}" + Sparql.addServiceClosing(USING_GRAPH);
Query query = QueryFactory.create(Sparql.addPrefix().concat(queryString));
try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) {
Map<String, Map<String, List<String>>> serviceParams = new HashMap<String, Map<String, List<String>>>();
Map<String, List<String>> params = new HashMap<String, List<String>>();
List<String> values = new ArrayList<String>();
values.add("20000");
params.put("timeout", values);
serviceParams.put(serviceURI, params);
qexec.getContext().set(ARQ.serviceParams, serviceParams);
try {
ResultSet rs = qexec.execSelect();
System.out.println(rs.hasNext());
for (; rs.hasNext();) {
QuerySolution rb = rs.nextSolution();
RDFNode x = rb.get("resource");
if (x.isResource()) {
featureSet.add((Resource) x);
}
}
} finally {
qexec.close();
}
}
}
return featureSet;
}
public static List<Resource> searchObjectofInterest(String object) {
List<Resource> resources = new ArrayList<Resource>();
String serviceURI = "http://dbpedia.org/sparql";
String queryString = "" + Sparql.addService(USING_GRAPH, serviceURI) + "SELECT distinct ?hotel " + "WHERE { "
+ " ?hotel a <http://dbpedia.org/ontology/" + object + ">. }" + " LIMIT 1"
+ Sparql.addServiceClosing(USING_GRAPH);
Query query = QueryFactory.create(Sparql.addPrefix().concat(queryString));
try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) {
Map<String, Map<String, List<String>>> serviceParams = new HashMap<String, Map<String, List<String>>>();
Map<String, List<String>> params = new HashMap<String, List<String>>();
List<String> values = new ArrayList<String>();
values.add("20000");
params.put("timeout", values);
serviceParams.put(serviceURI, params);
qexec.getContext().set(ARQ.serviceParams, serviceParams);
try {
ResultSet rs = qexec.execSelect();
for (; rs.hasNext();) {
QuerySolution rb = rs.nextSolution();
RDFNode x = rb.get("hotel");
if (x.isResource()) {
resources.add((Resource) x);
}
}
} finally {
qexec.close();
}
return resources;
} } }
Sparql.addService方法
public static String addService(boolean usingGraph, String serviceURI) {
if (!usingGraph) {
return "SELECT DISTINCT * WHERE { SERVICE <" + serviceURI + ">{";
} else {
return " ";
}
}
クエリ例:click me
PS:私は、接頭辞を使用しています:PREFIX geo: <http://www.opengis.net/ont/geosparql#>
「Sparql.addService」が何をしているのかはっきりしませんが、どういうわけか連合クエリを生成していると思いますか?それ以外の場合は、空のモデルに対してSPARQLクエリを実行します。デバッグの目的で、完全な最終クエリを提供して実際に何が実行されたかを確認する方がずっと簡単です。 – AKSW
JenaはGeoSPARQLをサポートしていません.Jeanは基本的な空間検索機能を提供します。 http://jena.apache.org/documentation/query/spatial-query.html 'bif:st_intersects'はGeoSPARQLでもJenaでもない - それはVirtuoso固有のものです。 – AndyS
@AndyS彼はDBpediaエンドポイントで連合クエリを実行していると思いますので、ここでは関係ありません。少なくともコードを見ているときには、Sparql.addService(USING_GRAPH、serviceURI)という魔法の行があります。それ以外の場合は、クエリー全体が空のJenaモデル上で実行されます。 – AKSW