你可以使用Jena的ARQ来对远程SPARQL端点执行查询。该过程在
ARQ - Querying Remote SPARQL Services中有描述。
在SELECT查询中使用ParameterizedSparqlStrings
为了在不同的位置执行查询,可能需要在执行查询时才知道这些位置,您可以使用
ParameterizedSparqlString来保存查询,然后在获得值后注入值。这是一个例子。查询是您提供的那个查询。我将其放入ParameterizedSparqlString中,然后使用
setIri
将
?s
设置为
http://dbpedia.org/resource/Mount_Monadnock
。
import com.hp.hpl.jena.query.ParameterizedSparqlString;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.ResultSetFormatter;
public class DBPediaQuery {
public static void main( String[] args ) {
final String dbpedia = "http://dbpedia.org/sparql";
final ParameterizedSparqlString queryString
= new ParameterizedSparqlString(
"PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>"+
"PREFIX dbo: <http://dbpedia.org/ontology/>" +
"SELECT * WHERE {" +
" ?s a dbo:Place ." +
" ?s geo:lat ?lat ." +
" ?s geo:long ?long ." +
"}" );
queryString.setIri( "?s", "http://dbpedia.org/resource/Mount_Monadnock");
QueryExecution exec = QueryExecutionFactory.sparqlService( dbpedia, queryString.toString() );
ResultSet results = exec.execSelect();
ResultSetFormatter.out( System.out, results );
}
}
这个打印的结果是:
--------------------------------------------------------------------------------------------------------------
| lat | long |
==============================================================================================================
| "42.8608"^^<http://www.w3.org/2001/XMLSchema#float> | "-72.1081"^^<http://www.w3.org/2001/XMLSchema#float> |
--------------------------------------------------------------------------------------------------------------
一旦您获得了
ResultSet
,就可以遍历解决方案的行并提取值。这里的值是
Literal
,从
Literal
中,您可以提取词汇形式(字符串值),或者相应Java类型的值(对于数字、字符串、布尔值等)。您可以执行以下操作来打印纬度和经度,而不使用
ResultSetFormatter
:
while ( results.hasNext() ) {
QuerySolution solution = results.next();
Literal latitude = solution.getLiteral( "?lat" );
Literal longitude = solution.getLiteral( "?long" );
String sLat = latitude.getLexicalForm();
String sLon = longitude.getLexicalForm();
float fLat = latitude.getFloat();
float fLon = longitude.getFloat();
System.out.println( "Strings: " + sLat + "," + sLon );
System.out.println( "Floats: " + fLat + "," + fLon );
}
这个变更后的输出是:
Strings: 42.8608,-72.1081
Floats: 42.8608,-72.1081
在CONSTRUCT查询中使用ParameterizedSparqlStrings
根据一些评论,使用CONSTRUCT
查询将每个查询的结果保存起来,并将它们聚合成一个更大的模型也可能很有用。以下是使用构造查询检索Mount Monadnock和Mount Lafayette的纬度和经度,并将其存储在单个模型中的代码。(这里我们只是使用CONSTRUCT WHERE {…}
,因此返回的模型与匹配部分完全相同。您可以通过使用CONSTRUCT {…} WHERE {…}
获得不同的结果。)
import com.hp.hpl.jena.query.ParameterizedSparqlString;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
public class DBPediaQuery {
public static void main( String[] args ) {
final String dbpedia = "http://dbpedia.org/sparql";
final ParameterizedSparqlString queryString
= new ParameterizedSparqlString(
"PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>"+
"PREFIX dbo: <http://dbpedia.org/ontology/>" +
"CONSTRUCT WHERE {" +
" ?s a dbo:Place ." +
" ?s geo:lat ?lat ." +
" ?s geo:long ?long ." +
"}" );
Model allResults = ModelFactory.createDefaultModel();
for ( String mountain : new String[] { "Mount_Monadnock", "Mount_Lafayette" } ) {
queryString.setIri( "?s", "http://dbpedia.org/resource/" + mountain );
QueryExecution exec = QueryExecutionFactory.sparqlService( dbpedia, queryString.toString() );
Model results = exec.execConstruct();
allResults.add( results );
}
allResults.setNsPrefix( "geo", "http://www.w3.org/2003/01/geo/wgs84_pos#" );
allResults.setNsPrefix( "dbo", "http://dbpedia.org/ontology/" );
allResults.setNsPrefix( "dbr", "http://dbpedia.org/resource/" );
allResults.write( System.out, "N3" );
}
}
输出显示了两个查询的三元组:
@prefix dbr: <http://dbpedia.org/resource/> .
@prefix geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> .
@prefix dbo: <http://dbpedia.org/ontology/> .
dbr:Mount_Lafayette
a dbo:Place ;
geo:lat "44.1607"^^<http://www.w3.org/2001/XMLSchema#float> ;
geo:long "-71.6444"^^<http://www.w3.org/2001/XMLSchema#float> .
dbr:Mount_Monadnock
a dbo:Place ;
geo:lat "42.8608"^^<http://www.w3.org/2001/XMLSchema#float> ;
geo:long "-72.1081"^^<http://www.w3.org/2001/XMLSchema#float> .
resource
是实际的事物,而page
只是包含有关它的信息的页面。如果您滚动到底部... - Joshua Taylorresource
(资源)有关,而不是与页面有关。这有点像传记包含了很多关于一个人的信息;传记中的信息(在page
上)不是关于传记(page
)本身,而是关于这个人(resource
)。 - Joshua Taylor