SPARQL 构造查询不适用于 java
SPARQL Construct query not working on java
我想从 DBPedia 中获取所有与 Jupiter 相关的 resource/object 对,并通过 Apache Jena 构造查询以 java 中的 RDF 格式输出结果。我的构造查询在 http://dbpedia.org/sparql 服务中工作,如下所示:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
construct {<http://dbpedia.org/resource/Jupiter> ?o ?r. }
{{ <http://dbpedia.org/resource/Jupiter> ?o ?r }
UNION
{?o ?r <http://dbpedia.org/resource/Jupiter>}}
我写了一个java程序,将CONSTRUCT查询结果以RDF格式写入Jupiter.rdf文件,但出现异常。我的java代码如下:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import org.apache.jena.query.ParameterizedSparqlString;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSetFactory;
import org.apache.jena.query.ResultSetRewindable;
public class Jupiter {
public static void main(String[] args) throws IOException {
ParameterizedSparqlString querystring = new ParameterizedSparqlString(""
+ "construct {<http://dbpedia.org/resource/Jupiter> ?o ?r } where {{ <http://dbpedia.org/resource/Jupiter> ?o ?r } UNION"
+ " {?r ?o <http://dbpedia.org/resource/Jupiter>}}");
QueryExecution exec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", querystring.asQuery());
ResultSetRewindable result = ResultSetFactory.makeRewindable(exec.execSelect());
try (BufferedWriter bw = new BufferedWriter(new FileWriter("Jupiter.rdf")))
{
while (result.hasNext()) {
QuerySolution querysolution = result.next();
bw.write(querysolution.get("o").toString());
bw.write(querysolution.get("r").toString());
}
bw.flush();
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
例外情况是:
Exception in thread "main" org.apache.jena.sparql.resultset.ResultSetException: Not a string: key: value
at org.apache.jena.sparql.resultset.JSONInput.stringOrNull(JSONInput.java:230)
at org.apache.jena.sparql.resultset.JSONInput.parseOneTerm(JSONInput.java:201)
at org.apache.jena.sparql.resultset.JSONInput.parse(JSONInput.java:172)
at org.apache.jena.sparql.resultset.JSONInput.process(JSONInput.java:100)
at org.apache.jena.sparql.resultset.JSONInput.fromJSON(JSONInput.java:63)
at org.apache.jena.query.ResultSetFactory.fromJSON(ResultSetFactory.java:331)
at org.apache.jena.sparql.engine.http.QueryEngineHTTP.execResultSetInner(QueryEngineHTTP.java:385)
at org.apache.jena.sparql.engine.http.QueryEngineHTTP.execSelect(QueryEngineHTTP.java:351)
你能告诉我为什么会这样吗?非常感谢您的帮助
您有一个 SPARQL CONSTRUCT 查询,而不是 SELECT 查询。因此,您必须调用 exec.execConstruct()
,您将得到一个 Model
对象,其中包含三元组而不是 ResultSet
。
我想从 DBPedia 中获取所有与 Jupiter 相关的 resource/object 对,并通过 Apache Jena 构造查询以 java 中的 RDF 格式输出结果。我的构造查询在 http://dbpedia.org/sparql 服务中工作,如下所示:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
construct {<http://dbpedia.org/resource/Jupiter> ?o ?r. }
{{ <http://dbpedia.org/resource/Jupiter> ?o ?r }
UNION
{?o ?r <http://dbpedia.org/resource/Jupiter>}}
我写了一个java程序,将CONSTRUCT查询结果以RDF格式写入Jupiter.rdf文件,但出现异常。我的java代码如下:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import org.apache.jena.query.ParameterizedSparqlString;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSetFactory;
import org.apache.jena.query.ResultSetRewindable;
public class Jupiter {
public static void main(String[] args) throws IOException {
ParameterizedSparqlString querystring = new ParameterizedSparqlString(""
+ "construct {<http://dbpedia.org/resource/Jupiter> ?o ?r } where {{ <http://dbpedia.org/resource/Jupiter> ?o ?r } UNION"
+ " {?r ?o <http://dbpedia.org/resource/Jupiter>}}");
QueryExecution exec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", querystring.asQuery());
ResultSetRewindable result = ResultSetFactory.makeRewindable(exec.execSelect());
try (BufferedWriter bw = new BufferedWriter(new FileWriter("Jupiter.rdf")))
{
while (result.hasNext()) {
QuerySolution querysolution = result.next();
bw.write(querysolution.get("o").toString());
bw.write(querysolution.get("r").toString());
}
bw.flush();
bw.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
例外情况是:
Exception in thread "main" org.apache.jena.sparql.resultset.ResultSetException: Not a string: key: value
at org.apache.jena.sparql.resultset.JSONInput.stringOrNull(JSONInput.java:230)
at org.apache.jena.sparql.resultset.JSONInput.parseOneTerm(JSONInput.java:201)
at org.apache.jena.sparql.resultset.JSONInput.parse(JSONInput.java:172)
at org.apache.jena.sparql.resultset.JSONInput.process(JSONInput.java:100)
at org.apache.jena.sparql.resultset.JSONInput.fromJSON(JSONInput.java:63)
at org.apache.jena.query.ResultSetFactory.fromJSON(ResultSetFactory.java:331)
at org.apache.jena.sparql.engine.http.QueryEngineHTTP.execResultSetInner(QueryEngineHTTP.java:385)
at org.apache.jena.sparql.engine.http.QueryEngineHTTP.execSelect(QueryEngineHTTP.java:351)
你能告诉我为什么会这样吗?非常感谢您的帮助
您有一个 SPARQL CONSTRUCT 查询,而不是 SELECT 查询。因此,您必须调用 exec.execConstruct()
,您将得到一个 Model
对象,其中包含三元组而不是 ResultSet
。