Java Jena SPARQL Запрос не получает результаты - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь использовать Jena в Java для запуска запроса SPARQL и получения результатов из файла .ttl.По какой-то причине желаемые результаты не извлекаются.Я посмотрел на мой запрос SPARQL, и я не уверен, где находится ошибка, но результаты не доставляются моему объекту ResultSet.Вот мой код ниже:

BasicConfigurator.configure();
FileManager.get().addLocatorClassLoader(QuerySparql.class.getClassLoader());
Model model = FileManager.get().loadModel(My_Path//sample.ttl", "TTL");
String queryString = 
            "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" +
            "PREFIX foaf: <http://xmlns.com/foaf/0.1/name>\n" +
            "PREFIX dbo: <http://dbpedia.org/ontology/>\n" +
            "PREFIX db: <http://dbpedia.org/resource/>\n " +
            "SELECT ?team WHERE { \n" + 
            "?simeon foaf:name \"Simeon Ikudabo\"@en .\n" +
            "?simeon dbo:team ?team\n" +
            "}";
Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.create(query, model);
try {
        ResultSet results = qexec.execSelect();
        while(results.hasNext()) {
            QuerySolution soln = results.nextSolution();
            Literal team = soln.getLiteral("team");
            System.out.println(team);
        }
    }
catch(Exception e) {
        e.printStackTrace(System.out);
}

System.out.println("Done");

А вот вывод в консоли, но на самом деле он не получает никаких результатов, которые я ищу, и пропускает цикл while, потому что нетв результате получается ResultSet:

3 [main] DEBUG Jena  - Jena initialization
375 [main] DEBUG org.apache.jena.util.FileManager  - Add location: LocatorFile
377 [main] DEBUG org.apache.jena.util.FileManager  - Add location: ClassLoaderLocator
384 [main] DEBUG org.apache.jena.util.LocationMapper  - Failed to find configuration: file:location-mapping.rdf;file:location-mapping.n3;file:location-mapping.ttl;file:etc/location-mapping.rdf;file:etc/location-mapping.n3;file:etc/location-mapping.ttl
384 [main] DEBUG org.apache.jena.util.FileManager  - Add location: LocatorFile
395 [main] DEBUG org.apache.jena.util.FileManager  - Add location: LocatorURL
395 [main] DEBUG org.apache.jena.util.FileManager  - Add location: ClassLoaderLocator
423 [main] DEBUG org.apache.jena.riot.system.stream.JenaIOEnvironment  - Failed to find configuration: location-mapping.ttl;location-mapping.rdf;location-mapping.n3;etc/location-mapping.rdf;etc/location-mapping.n3;etc/location-mapping.ttl
1731 [main] DEBUG org.apache.jena.info  - System architecture: 64 bit
1862 [main] DEBUG org.apache.jena.info  - System architecture: 64 bit
1896 [main] DEBUG org.apache.jena.util.FileManager  - loadModel(My_Path//sample.ttl, TTL)
1897 [main] DEBUG org.apache.jena.riot.system.stream.StreamManager  - Not mapped: My_Path//sample.ttl
1951 [main] DEBUG org.apache.jena.riot.system.stream.StreamManager  - Found: My_Path//sample.ttl (LocatorFile)
2633 [main] DEBUG org.apache.jena.shared.LockMRSW  - Lock : main
2638 [main] DEBUG org.apache.jena.shared.LockMRSW  - Lock : main
Done

Как видите, я создаю переменную ?team, которая является dbpedia.org/ontology/team в моем локальном файле черепахи dbpedia.?simeon в этом примере - это спортсмен, которого ищут, и Симеон отобразит foaf:name "Simeon Ikudabo"@en.Мое последнее тройное утверждение - ?simeon dbo:team ?team.Это должно найти значение команды онтологии dbpedia, которое соответствует Симеону Икудабо.Однако по какой-то причине ResultSet не получает это значение.Я посмотрел в Интернете, что может быть не так с моим запросом, но я не уверен, что проблема может быть из моего исследования.Вот мой .ttl файл с данными, и он, кажется, правильно отформатирован:

<http://dbpedia.org/resource/Simeon_Ikudabo> <http://dbpedia.org/ontology/team> 
<http://dbpedia.org/resource/Indiana_Hoosiers> .
<http://dbpedia.org/resource/Simeon_Ikudabo> <http://www.xmlns.com/foaf/0.1/name> "Simeon Ikudabo"@en .
<http://dbpedia.org/resource/Nick_Mangeri> <http://dbpedia.org/ontology/team> <http://dbpedia.org/resource/Akron_Zips> .
<http://dbepdia.org/resource/Nick_Mangeri> <http://www.xmlns.com/foaf/0.1/name> "Nick Mangeri"@en .

Я также учел возможность проблемы ввода-вывода, но когда я просто читаю модель в Java, кажется,чтобы получить правильный ввод-вывод из файла.Вот мой код для простого чтения модели:

Model model = ModelFactory.createDefaultModel();
model.read("My_Path//sample.ttl", "TURTLE");
model.write(System.out);

А вот вывод:

0 [main] DEBUG Jena  - Jena initialization
417 [main] DEBUG org.apache.jena.util.FileManager  - Add location: LocatorFile
419 [main] DEBUG org.apache.jena.util.FileManager  - Add location: ClassLoaderLocator
428 [main] DEBUG org.apache.jena.util.LocationMapper  - Failed to find configuration: file:location-mapping.rdf;file:location-mapping.n3;file:location-mapping.ttl;file:etc/location-mapping.rdf;file:etc/location-mapping.n3;file:etc/location-mapping.ttl
428 [main] DEBUG org.apache.jena.util.FileManager  - Add location: LocatorFile
431 [main] DEBUG org.apache.jena.util.FileManager  - Add location: LocatorURL
431 [main] DEBUG org.apache.jena.util.FileManager  - Add location: ClassLoaderLocator
457 [main] DEBUG org.apache.jena.riot.system.stream.JenaIOEnvironment  - Failed to find configuration: location-mapping.ttl;location-mapping.rdf;location-mapping.n3;etc/location-mapping.rdf;etc/location-mapping.n3;etc/location-mapping.ttl
1793 [main] DEBUG org.apache.jena.info  - System architecture: 64 bit
1912 [main] DEBUG org.apache.jena.info  - System architecture: 64 bit
2254 [main] DEBUG org.apache.jena.riot.system.stream.StreamManager  - Not mapped: My_Path//sample.ttl
2255 [main] DEBUG org.apache.jena.riot.system.stream.StreamManager  - open(My_Path//sample.ttl)
2255 [main] DEBUG org.apache.jena.riot.system.stream.StreamManager  - Not mapped: My_Path//sample.ttl
2288 [main] DEBUG org.apache.jena.riot.system.stream.StreamManager  - Found: My_Path//sample.ttl (LocatorFile)
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="http://dbpedia.org/ontology/"
    xmlns:j.1="http://dbpedia.org/ontology/"
    xmlns:j.2="http://www.xmlns.com/foaf/0.1/">
<rdf:Description rdf:about="http://dbpedia.org/resource/Nick_Mangeri">
    <j.1:team rdf:resource="http://dbpedia.org/resource/Akron_Zips"/>
</rdf:Description>
<rdf:Description rdf:about="http://dbepdia.org/resource/Nick_Mangeri">
    <j.2:name xml:lang="en">Nick Mangeri</j.2:name>
</rdf:Description>
<rdf:Description rdf:about="http://dbpedia.org/resource/Simeon_Ikudabo">
    <j.2:name xml:lang="en">Simeon Ikudabo</j.2:name>
    <j.0:team rdf:resource="http://dbpedia.org/resource/Indiana_Hoosiers"/>
 </rdf:Description>
</rdf:RDF>

Итак, я знаю, что Джена может прочитать файл.Я создал SIMILAR-запрос, используя конечную точку Virtuoso SPARQL для DBpedia, и последовательно получал правильные результаты.Это аналогичный запрос, который я выполнял в качестве теста с конечной точки Virtuoso SPARQL для DBpedia:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix db: <http://dbpedia.org/resource/>

SELECT ?draftTeam WHERE{
?kobe dbpedia-owl:draftTeam ?draftTeam .
?kobe foaf:name "Kobe Bryant"@en .
}

Я знаю, что конечная точка Virtuoso SPARQL немного отличается от запроса Apache Jena SPARQL, но это то же самоеобщий синтаксис.Я озадачен тем, почему я не могу выполнить запрос в Йене.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Мне удалось решить проблему.Вот пример кода ниже:

BasicConfigurator.configure();
FileManager.get().addLocatorClassLoader(QuerySparql.class.getClassLoader());
Model model = FileManager.get().loadModel("My_Path//sample.ttl", "TTL");
String queryString = 
            "PREFIX db: <http://dbpedia.org/resource> \n" +
            "SELECT ?meshId WHERE{ \n" + 
            "?autism <http://xmlns.com/foaf/0.1/name> \"Autism\"@en .\n" +
            "?autism <http://dbpedia.org/ontology/meshId> ?meshId \n" +
            "}";

Query query = QueryFactory.create(queryString);
QueryExecution qexec = QueryExecutionFactory.create(query, model);

ResultSet results = qexec.execSelect();
if(results.hasNext()) {
    System.out.println("has results!");
}
else {
    System.out.println("No Results!");
}

while(results.hasNext()) {
    QuerySolution soln = results.nextSolution();
    Literal r = soln.getLiteral("meshId");
    System.out.println(r);
}

Ошибка, по-видимому, была в запросе.Мне нужно было использовать полный URL-адрес, который находится в файле dbpedia для моего запроса.В файле dbpedia URL-адрес выглядит следующим образом:

<http://xmlns.com/foaf/0.1/name> "Autism"@en .

Использование этого URL в фактическом запросе, подобном следующему:

"?autism <http://xmlns.com/foaf/0.1/name> \"Autism\"@en .\n

в конечном итоге решило проблему.Префикс, который я использовал ранее в запросе, не совпадал с префиксом, который был в файле dbpedia.Таким образом, префикс:

PREFIX foaf: <http://xmlns.com/foaf/0.1/> 

не будет работать.Вместо этого мне нужно указать URL-адрес, который напрямую соответствует найденному в файле dbpedia.

0 голосов
/ 07 октября 2018

У ваших данных есть тройка

<http://dbpedia.org/resource/Simeon_Ikudabo> <http://dbepdia.org/ontology/team> <http://dbpedia.org/resource/Indiana_Hoosiers> .

И в собственности есть опечатка: dbepdia вместо dbpedia.Я обнаружил это, когда заметил в печатной модели, что существует два пространства имен:

xmlns:j.0="http://dbepdia.org/ontology/"
xmlns:j.1="http://dbpedia.org/ontology/"
...