2017-02-12 3 views
0

私は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#>

+0

「Sparql.addService」が何をしているのかはっきりしませんが、どういうわけか連合クエリを生成していると思いますか?それ以外の場合は、空のモデルに対してSPARQLクエリを実行します。デバッグの目的で、完全な最終クエリを提供して実際に何が実行されたかを確認する方がずっと簡単です。 – AKSW

+2

JenaはGeoSPARQLをサポートしていません.Jeanは基本的な空間検索機能を提供します。 http://jena.apache.org/documentation/query/spatial-query.html 'bif:st_intersects'はGeoSPARQLでもJenaでもない - それはVirtuoso固有のものです。 – AndyS

+0

@AndyS彼はDBpediaエンドポイントで連合クエリを実行していると思いますので、ここでは関係ありません。少なくともコードを見ているときには、Sparql.addService(USING_GRAPH、serviceURI)という魔法の行があります。それ以外の場合は、クエリー全体が空のJenaモデル上で実行されます。 – AKSW

答えて

0

私は私の問題への解決策を発見しました。

bifという接頭辞は何らかの理由でbif:st_intersects(?location, ?sourcegeo, 20)に使用できません。だから完全なURIを入れてFILTER (<http://www.openlinksw.com/schema/sparql/extensions#bif:st_intersects(?location,?sourcegeo,20)>)

EDIT:@ TallTedの提案に続いて、私はSparql.addPrefix()メソッドを更新してPREFIX bif: <bif:>を入れました。このようにして、SPARQLクエリで完全なURIを使用する必要はありません。

public static String addPrefix() { 
     String prefix = "" + "PREFIX owl: <http://www.w3.org/2002/07/owl#>"     
       + "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> " 
       + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> " 
       + "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " 
       + "PREFIX foaf: <http://xmlns.com/foaf/0.1/> " 
       + "PREFIX dc: <http://purl.org/dc/elements/1.1/> " 
       + "PREFIX bif: <bif:>" 
       + "PREFIX : <http://dbpedia.org/resource/> " 
       + "PREFIX dbpedia2: <http://dbpedia.org/property/> " 
       + "PREFIX dbpedia: <http://dbpedia.org/> " 
       + "PREFIX skos: <http://www.w3.org/2004/02/skos/core#> " 
       + "PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>" 
       + "PREFIX e: <http://learningsparql.com/ns/expenses#> " 
       + "PREFIX d: <http://learningsparql.com/ns/data#> "; 
     return prefix; 
+0

'+" PREFIX bif: "'を使用すると、CURIを成功させることができます。 – TallTed

+0

@TallTedというアイデアをありがとう。できます!しかし、私は

+0

'bif:'は組み込み関数 'built-in function'を表す組み込みVirtuosoプレフィックス(およびSPARQL内のURIスキーム)です。バックエンドにサブミットする前に、SPARQLをあらかじめ解析するツールには 'PREFIX'文だけが必要です。これらのツールは一般に、拡張CURIの有効性をチェックしません。彼らは拡張があることを確認するだけです。 – TallTed

関連する問題