簡體   English   中英

Java Jena SPARQL查詢未檢索結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM