Sparql 使用Jena查询时没有结果,但DBpedia查询表单返回结果

Sparql 使用Jena查询时没有结果,但DBpedia查询表单返回结果,sparql,jena,dbpedia,Sparql,Jena,Dbpedia,如果我使用Jena而不是 我在Jena中的代码(我尝试返回两个列表,其中包含搜索文本名称的类型): s1=“酮内酯”; s2=“氨基香豆素”; String sparqlQueryString1=“前缀rdf:前缀rdfs:”+ “选择不同的?类型1”+ 其中{数据rdfs:label-label1.?数据rdf:type-type1.FILTER包含(lcase(str(?label1)),“+s1.toLowerCase()+”)。}”; Query=QueryFactory.create(

如果我使用Jena而不是

我在Jena中的代码(我尝试返回两个列表,其中包含搜索文本名称的类型):

s1=“酮内酯”;
s2=“氨基香豆素”;
String sparqlQueryString1=“前缀rdf:前缀rdfs:”+
“选择不同的?类型1”+
其中{数据rdfs:label-label1.?数据rdf:type-type1.FILTER包含(lcase(str(?label1)),“+s1.toLowerCase()+”)。}”;
Query=QueryFactory.create(sparqlQueryString1);
QueryEngineHTTP objectToExec=QueryExecutionFactory.createServiceRequest(“http://dbpedia.org/sparql“,查询);
objectToExec.addParam(“超时”,“3000”);
ResultSet results=objectToExec.execSelect();
列表s=ResultSetFormatter.toList(结果);
ResultSetFormatter.out(System.out、结果、查询);
sparqlQueryString1=“前缀rdf:前缀rdfs:”+
“选择不同的?类型1”+
其中{数据rdfs:label-label1.?数据rdf:type-type1.FILTER包含(lcase(str(?label1)),“+s2.toLowerCase()+”)。}”;
query=QueryFactory.create(sparqlQueryString1);
objectToExec=QueryExecutionFactory.createServiceRequest(“http://dbpedia.org/sparql“,查询);
objectToExec.addParam(“超时”,“3000”);
结果=objectToExec.execSelect();
列表s22=ResultSetFormatter.toList(结果);
ResultSetFormatter.out(System.out、结果、查询);
当我在查询表单中使用相同的查询时,它会得到结果:

SELECT distinct ?type1 WHERE{ ?data rdf:type ?type1. ?data  rdfs:label  ?label1 .    FILTER contains(lcase(str(?label1)), 'ketolide') .}
这将返回:

type1

http://dbpedia.org/ontology/ChemicalCompound
http://dbpedia.org/class/yago/WikicatKetolideAntibiotics
http://dbpedia.org/class/yago/Agent114778436
http://dbpedia.org/class/yago/Antibacterial102716205
http://dbpedia.org/class/yago/Antibiotic102716866
http://dbpedia.org/class/yago/CausalAgent100007347
http://dbpedia.org/class/yago/Drug103247620
http://dbpedia.org/class/yago/Matter100020827
http://dbpedia.org/class/yago/Medicine103740161
http://dbpedia.org/class/yago/PhysicalEntity100001930
http://dbpedia.org/class/yago/Substance100020090
http://dbpedia.org/class/yago/WikicatAntibiotics

这种差异的原因是什么?

我可以找出两个差异

  • 默认图形IRI的使用:首先,处的查询表单将默认图形IRI设置为
    http://dbpedia.org
    。你的代码不能做到这一点。因此,您的代码将针对数据库中的所有图形运行,而不仅仅是针对DBpedia图形。要将相同的默认图形添加到查询中,应执行以下操作:

    objectToExec.addDefaultGraph("http://dbpedia.org");
    
    (我不知道端点还有什么其他图形,所以我不知道这到底有多大区别。)

  • 不同的超时:其次,您的代码将超时设置为3000,而查询表单将其设置为30000。这个特定的端点被配置为在到达超时时返回到目前为止找到的任何内容,因此如果在3秒后没有找到任何内容,它将返回而没有结果。查询表单将允许查询运行30秒

  • 也就是说,全文搜索可以通过以下方式更高效地完成:

    这使用全文索引,这比扫描数据库中的所有字符串快得多


    最后,你应该考虑.< /P>你的查询很可怕,因为它必须对所有有标签的资源做一次完整的扫描,然后应用一个字符串函数。您在表单中得到一个结果,因为它碰巧在默认时间30秒内找到了一些匹配的资源。3000的单位是ms,因此是3s。triple store不太可能在这段时间内找到任何东西+1条小评论,尽管它已经非常快了,但我还是选择只使用英文标签:

    filter(langmatches(lang(?label1),“en”)
    FILTER bif:contains(?label1, 'ketolide')