Вопрос

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)"     |
-------------------------------------------------------------------------------------------------------------
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top