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, и я был бы признателен за любую помощь!