[英]Java Jena SPARQL Query not retrieving results
我正在嘗試在Java中使用Jena來運行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
如您所見,我在本地dbpedia turtle文件中創建了一個變量?team
,它是dbpedia.org/ontology/team
。 在此示例中, ?simeon
是正在被抬頭的運動員,Simeon將反映以下foaf:name "Simeon Ikudabo"@en
。 我的最后一個三元聲明是?simeon dbo:team ?team
。 這應該找到與Simeon Ikudabo對應的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 .
我還考慮了IO問題的可能性,但是當我只是用Java讀取模型時,似乎正在從文件中獲取正確的IO。 這是我的代碼,用於簡單閱讀模型:
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>
因此,我知道Jena可以讀取文件。 我使用Virtuoso SPARQL端點為DBpedia創建了一個SIMILAR查詢,並始終獲得正確的結果。 他是我從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查詢略有不同,但是它是相同的常規語法。 我為無法在耶拿執行查詢而感到困惑。
您的數據是三重
<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/"
我能夠解決問題。 這是下面的代碼示例:
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);
}
該錯誤似乎已出現在查詢中。 我需要使用dbpedia文件中的完整URL進行查詢。 在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/>
不管用。 相反,我需要放置與dbpedia文件中找到的URL直接匹配的URL。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.