【问题标题】:Java Jena SPARQL Query not retrieving resultsJava Jena SPARQL 查询未检索结果
【发布时间】:2018-10-07 16:18:57
【问题描述】:

我正在尝试使用 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 可以读取该文件。我使用 DBpedia 的 Virtuoso SPARQL 端点创建了一个 SIMILAR 查询,并始终获得正确的结果。他是一个类似的查询,我作为 DBpedia 的 Virtuoso SPARQL 端点的测试运行:

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 查询略有不同,但它是相同的通用语法。我很困惑为什么我不能在 Jena 中执行查询。

【问题讨论】:

  • 好吧,你的 FOAF 前缀声明是错误的:PREFIX foaf: &lt;http://xmlns.com/foaf/0.1/name&gt; - 它应该是 PREFIX foaf: &lt;http://xmlns.com/foaf/0.1/&gt;,即没有属性 name
  • @AKSW 谢谢。我之前看过那个并没有解决问题。
  • 这是什么意思?即使使用正确的前缀声明它也不起作用?顺便说一句,如果你编辑你的问题并修复错别字,即使它不能解决问题,那会很好 - 至少它可以避免其他人发现同样的问题
  • 请仔细检查数据+查询。在您使用PREFIX foaf: &lt;http://xmlns.com/foaf/0.1/name&gt; 的查询中。在您使用的数据中http://www.xmlns.com/foaf/0.1/ - 两者显然都是错误的,前者必须摆脱name,后者是错误的,因为www. 没有意义。 FOAF:http://xmlns.com/foaf/0.1/
  • @AKSW 我的意思是把它改成 xlmns.com/foaf/0.1> 并没有解决问题。

标签: java sparql jena dbpedia


【解决方案1】:

我能够解决问题。这是下面的代码示例:

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。

【讨论】:

  • 什么?你看过我最后的评论了吗?问题是在数据中前缀是http://www.xmlns.com/foaf/0.1/,而在查询中你使用http://xmlns.com/foaf/0.1/name - 两者都不匹配 而且,都是错误的 - 正确一个是http://xmlns.com/foaf/0.1/ - 解决方案显然使用完整的URI,而是修复数据和查询中的前缀声明。
  • @AKSW 我检查并使用完整的 URI 是在这种情况下修复它的原因。我将前缀更改为 PREFIX foaf:xmlns.com/foaf/0.1> 但这不起作用。删除前缀并在查询正文中简单地使用 xmlns/foaf/0.1/name> “Name”@en 即可。正如您所提到的,xmlns.com/foaf/0.1> 是正确的解决方案,但是,在耶拿使用 dbpedia mappingbased_properties 数据集时,该解决方案将不起作用。例如,我使用的前缀 foaf:name “name”@en不会在查询正文中工作。
  • 好吧,我认为您当时还没有解决问题。澄清一下,我在我的计算机上使用 Apache Jena 进行了尝试,它按预期工作:这是 固定查询PREFIX foaf: &lt;http://xmlns.com/foaf/0.1/&gt; PREFIX dbo: &lt;http://dbpedia.org/ontology/&gt; SELECT ?team WHERE { ?simeon foaf:name "Simeon Ikudabo"@en . ?simeon dbo:team ?team }
  • 固定数据(第 1 部分)&lt;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://xmlns.com/foaf/0.1/"&gt; &lt;rdf:Description rdf:about="http://dbpedia.org/resource/Nick_Mangeri"&gt; &lt;j.1:team rdf:resource="http://dbpedia.org/resource/Akron_Zips"/&gt; &lt;/rdf:Description&gt;
  • @SimeonIkudabo - 您找到了解决方法,而不是解决方案。 (您发布的每条评论以及您的原始问题中都存在拼写错误和其他错误。)您的解决方法采用了不同的方法,消除了这些错误——它没有纠正您最初努力中的实际错误。如果应用得当,AKSWjoshua-taylor 对最初努力的修正也会带来成功。
【解决方案2】:

你的数据有三倍

<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/"

【讨论】:

  • 感谢您发现这个错字。我编辑了我的问题并解决了这个问题。我仍然遇到同样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多