SPARQL-запрос не возвращает результатов в Йене

Я пытаюсь найти фильмы в dbpedia, в которых есть сюжеты, режиссеры и актеры, общие с данным фильмом. Поиск производится по названию фильма. Вот мой последний запрос:

SELECT (SUM(?quant) as ?final) ?movie {
    {
    SELECT distinct ?quant ?movie
    WHERE {
      SELECT ?movie ?name  (4*count(?movie) as ?quant)
      WHERE {
        ?movie rdf:type <http://dbpedia.org/ontology/Film>;
        foaf:name ?name;
        rdfs:label ?film_title;
        dbo:director ?director.
        {
          SELECT DISTINCT ?director
          WHERE {
            ?movie rdf:type <http://dbpedia.org/ontology/Film>;
            rdfs:label ?film_title;
            foaf:name ?name;
            dbo:director ?director.
            FILTER (lang(?film_title) = 'en')
            FILTER regex(?name, 'Fast and Furious')
          }
        }
        FILTER (lang(?film_title) = 'en')
      }
      GROUP BY ?movie ?name
      ORDER BY DESC(?quant)
    }
  }
  UNION {
    SELECT distinct ?quant ?movie
    WHERE{
      SELECT ?movie ?name (count(?movie) as ?quant)
      WHERE {
        ?movie rdf:type <http://dbpedia.org/ontology/Film>;
        foaf:name ?name;
        rdfs:label ?film_title;
        dct:subject ?subject.
        {
          SELECT DISTINCT ?subject
          WHERE {
            ?movie rdf:type <http://dbpedia.org/ontology/Film>;
            rdfs:label ?film_title;
            foaf:name ?name;
            dct:subject ?subject.
            FILTER (lang(?film_title) = 'en')
            FILTER regex(?name, 'Fast and Furious')
          }
        }
        FILTER (lang(?film_title) = 'en')
      }
      GROUP BY ?movie ?name
      ORDER BY DESC(?quant)
    }
  }
  UNION {
    SELECT distinct ?quant ?movie
    WHERE{
      SELECT ?movie ?name (2*count(?movie) as ?quant)
      WHERE {
        ?movie rdf:type <http://dbpedia.org/ontology/Film>;
        foaf:name ?name;
        rdfs:label ?film_title;
        dbo:starring ?starring.
        {
          SELECT DISTINCT ?starring
          WHERE {
            ?movie rdf:type <http://dbpedia.org/ontology/Film>;
            rdfs:label ?film_title;
            foaf:name ?name;
            dbo:starring ?starring.
            FILTER (lang(?film_title) = 'en')
            FILTER regex(?name, 'Fast and Furious')
          }
        }
        FILTER (lang(?film_title) = 'en')
      }
      GROUP BY ?movie ?name
      ORDER BY DESC(?quant)
    }
  }
}
GROUP BY ?movie
ORDER BY DESC(?final)
LIMIT 11

Это работает здесь: https://dbpedia.org/sparql

И не возвращайте никаких ошибок, когда я проверяю здесь: http://www.sparql.org/query-validator.html

Однако, когда я пытаюсь запустить его в Йене, он ничего не возвращает. Вот мой метод:

public List<String> getRankedMovies(final String movieName) {
    List<String> rankedMovies = new ArrayList<>();

    final String header = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> "+
                          "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"+
                          "PREFIX foaf: <http://xmlns.com/foaf/0.1/> "+
                          "PREFIX dct: <http://purl.org/dc/terms/> "+
                          "PREFIX dbo: <http://dbpedia.org/ontology/> ";
    final String selectSum = "SELECT (SUM(?quant) as ?final) ?movie {";
    final String selectDirectorOccurency = "{ "+
                                           "    SELECT distinct ?quant ?movie "+
                                           "    WHERE {"+
                                           "        SELECT ?movie ?name (4*count(?movie) as ?quant) "+
                                           "        WHERE {"+
                                           "            ?movie rdf:type <http://dbpedia.org/ontology/Film>;"+
                                           "            foaf:name ?name;"+
                                           "            rdfs:label ?film_title;"+
                                           "            dbo:director ?director."+
                                           "            {"+
                                           "                SELECT DISTINCT ?director "+
                                           "                WHERE {"+
                                           "                    ?movie rdf:type <http://dbpedia.org/ontology/Film>;"+
                                           "                    rdfs:label ?film_title;"+
                                           "                    foaf:name ?name;"+
                                           "                    dbo:director ?director."+
                                           "                    FILTER (lang(?film_title) = 'en')"+
                                           "                    FILTER regex(?name, \""+movieName+"\")"+
                                           "                }"+
                                           "            }"+
                                           "            FILTER (lang(?film_title) = 'en')"+
                                           "        }"+
                                           "        GROUP BY ?movie ?name "+
                                           "        ORDER BY DESC(?quant)"+
                                           "    }"+
                                           "}";
    final String union = "UNION {";
    final String selectSubjectOccurency = "SELECT distinct ?quant ?movie "+
                                          "WHERE {"+
                                          "     SELECT ?movie ?name (count(?movie) as ?quant) "+
                                          "     WHERE { "+
                                          "         ?movie rdf:type <http://dbpedia.org/ontology/Film>;"+
                                          "         foaf:name ?name;"+
                                          "         rdfs:label ?film_title;"+
                                          "         dct:subject ?subject."+
                                          "         {"+
                                          "             SELECT DISTINCT ?subject "+
                                          "             WHERE { "+
                                          "                 ?movie rdf:type <http://dbpedia.org/ontology/Film>;"+
                                          "                 rdfs:label ?film_title;"+
                                          "                 foaf:name ?name;"+
                                          "                 dct:subject ?subject."+
                                          "                 FILTER (lang(?film_title) = 'en')"+
                                          "                 FILTER regex(?name, \""+movieName+"\")"+
                                          "             }"+
                                          "         }"+
                                          "         FILTER (lang(?film_title) = 'en')"+
                                          "     }"+
                                          "     GROUP BY ?movie ?name "+
                                          "     ORDER BY DESC(?quant)"+
                                          "}"+
                                          "}";
    final String selectStarOccurency = "SELECT distinct ?quant ?movie "+
                                       "WHERE {"+
                                       "    SELECT ?movie ?name (2*count(?movie) as ?quant) "+
                                       "    WHERE { "+
                                       "        ?movie rdf:type <http://dbpedia.org/ontology/Film>;"+
                                       "        foaf:name ?name;"+
                                       "        rdfs:label ?film_title;"+
                                       "        dbo:starring ?starring."+
                                       "        {"+
                                       "            SELECT DISTINCT ?starring "+
                                       "            WHERE {"+
                                       "                ?movie rdf:type <http://dbpedia.org/ontology/Film>;"+
                                       "                rdfs:label ?film_title;"+
                                       "                foaf:name ?name;"+
                                       "                dbo:starring ?starring."+
                                       "                FILTER (lang(?film_title) = 'en')"+
                                       "                FILTER regex(?name, \""+movieName+"\")"+
                                       "            }"+
                                       "        }"+
                                       "        FILTER (lang(?film_title) = 'en')"+
                                       "    }"+
                                       "    GROUP BY ?movie ?name"+
                                       "    ORDER BY DESC(?quant)"+
                                       "}";
    final String queryFinal = "}"+
                              "}"+
                              "GROUP BY ?movie "+
                              "ORDER BY DESC(?final) "+
                              "LIMIT 11";

    final String finalQuery = header+selectSum+selectDirectorOccurency+union+selectSubjectOccurency+union+selectStarOccurency+queryFinal;

    Query query = QueryFactory.create(finalQuery);
    QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
    ResultSet results = qexec.execSelect();
    System.out.println(finalQuery);
    while(results.hasNext()) {
        final QuerySolution soln = results.nextSolution();
        System.out.println(soln.toString());
    }
    qexec.close();
    return rankedMovies;
}

В ResultSet ничего нет. Я почти уверен, что запрос работает, потому что он возвращает то, что я хочу в Virtuoso. Я сделал другие запросы в том же проекте, и они отлично работают. Итак... Что может быть причиной проблемы? Я немного новичок в SPARQL, и я был бы признателен за любую помощь!

0 ответов

Другие вопросы по тегам