I am trying to experiment with Jena using Java code. In this application, I only get 20 null values.
public class Movie_database {
public static void main(String args[]) {
Model model = ModelFactory.createDefaultModel();
String sparqlQueryString = "PREFIX mdb: <http://data.linkedmdb.org/resource/movie/>"
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> "
+ "select ?director "
+ "where "
+ "{ ?director mdb:director_name ?value ."
+ "?director rdfs:label ?label .} "
+ "LIMIT 20";
Query query = QueryFactory.create(sparqlQueryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://linkedmdb.org/sparql", query);
ResultSet results = qexec.execSelect();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
Literal value = soln.getLiteral("value");
System.out.println(value);
}
}
}
After all, it prints the 20 null values, so it finds something, but why is the value of ?value
null?
The query you've constructed is like the following, except that the following can be run in standalone fashion using Jena's command line tools, because I've used a service
in the query.
PREFIX mdb: <http://data.linkedmdb.org/resource/movie/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?director where {
service <http://linkedmdb.org/sparql> {
?director mdb:director_name ?value ;
rdfs:label ?label .
}
}
limit 20
When I run this using the command line tools, these are the results (data.n3
is an empty file, because arq
requires a --data
argument, but the service
ensures that the data is coming from the remote endpoint):
$ arq --data data.n3 --query query.sparql
----------------------------------------------------
| director |
====================================================
| <http://data.linkedmdb.org/resource/director/1> |
| <http://data.linkedmdb.org/resource/director/2> |
| <http://data.linkedmdb.org/resource/director/3> |
| <http://data.linkedmdb.org/resource/director/4> |
| <http://data.linkedmdb.org/resource/director/5> |
| <http://data.linkedmdb.org/resource/director/6> |
| <http://data.linkedmdb.org/resource/director/7> |
| <http://data.linkedmdb.org/resource/director/8> |
| <http://data.linkedmdb.org/resource/director/9> |
| <http://data.linkedmdb.org/resource/director/10> |
| <http://data.linkedmdb.org/resource/director/11> |
| <http://data.linkedmdb.org/resource/director/12> |
| <http://data.linkedmdb.org/resource/director/13> |
| <http://data.linkedmdb.org/resource/director/14> |
| <http://data.linkedmdb.org/resource/director/15> |
| <http://data.linkedmdb.org/resource/director/16> |
| <http://data.linkedmdb.org/resource/director/17> |
| <http://data.linkedmdb.org/resource/director/18> |
| <http://data.linkedmdb.org/resource/director/20> |
| <http://data.linkedmdb.org/resource/director/21> |
----------------------------------------------------
Notice that you've projected ?director
, but not ?value
or ?label
. As a result there's no ?value
variable bound when you do:
Literal value = soln.getLiteral("value");
System.out.println(value);
and you get a null
result. You might be able to catch some of these kinds of mistakes using QuerySolution.contains
. All you need to do is update your query to
select ?director ?value where { # you probably want ?label in here, too
or even
select * where { # this would get all three variables
would suffice. Once you're selecting all three variables, you should get results like:
-------------------------------------------------------------------------------------------------------------
| director | value | label |
=============================================================================================================
| <http://data.linkedmdb.org/resource/director/1> | "Chris Morris" | "Chris Morris (Director)" |
| <http://data.linkedmdb.org/resource/director/2> | "Cecil B. DeMille" | "Cecil B. DeMille (Director)" |
| <http://data.linkedmdb.org/resource/director/3> | "Michael Mann" | "Michael Mann (Director)" |
| <http://data.linkedmdb.org/resource/director/4> | "Mustafa Altıoklar" | "Mustafa Altıoklar (Director)" |
| <http://data.linkedmdb.org/resource/director/5> | "Robert J. Flaherty" | "Robert J. Flaherty (Director)" |
| <http://data.linkedmdb.org/resource/director/6> | "Rex Ingram" | "Rex Ingram (Director)" |
| <http://data.linkedmdb.org/resource/director/7> | "William Dickson" | "William Dickson (Director)" |
| <http://data.linkedmdb.org/resource/director/8> | "Andrzej Å»uÅawski" | "Andrzej Å»uÅawski (Director)" |
| <http://data.linkedmdb.org/resource/director/9> | "Max Reinhardt" | "Max Reinhardt (Director)" |
| <http://data.linkedmdb.org/resource/director/10> | "Willis O'Brien" | "Willis O'Brien (Director)" |
| <http://data.linkedmdb.org/resource/director/11> | "Frank Miller" | "Frank Miller (Director)" |
| <http://data.linkedmdb.org/resource/director/12> | "David Byrne" | "David Byrne (Director)" |
| <http://data.linkedmdb.org/resource/director/13> | "John G. Avildsen" | "John G. Avildsen (Director)" |
| <http://data.linkedmdb.org/resource/director/14> | "Leslie Howard" | "Leslie Howard (Director)" |
| <http://data.linkedmdb.org/resource/director/15> | "John Hughes" | "John Hughes (Director)" |
| <http://data.linkedmdb.org/resource/director/16> | "Karl Koch" | "Karl Koch (Director)" |
| <http://data.linkedmdb.org/resource/director/17> | "George Miller" | "George Miller (Director)" |
| <http://data.linkedmdb.org/resource/director/18> | "Michael Powell" | "Michael Powell (Director)" |
| <http://data.linkedmdb.org/resource/director/20> | "Joseph De Grasse" | "Joseph De Grasse (Director)" |
| <http://data.linkedmdb.org/resource/director/21> | "Yamanaka Sadao" | "Yamanaka Sadao (Director)" |
-------------------------------------------------------------------------------------------------------------