SPARQL查询根据语句的顺序返回不同的结果

时间:2018-01-10 13:39:47

标签: sparql dbpedia virtuoso

我有一个SPARQL查询,它返回两个资源的最具体的公共类。

当我尝试在https://dbpedia.org/sparql上运行它时,有时它不会返回任何内容,有时它会返回我想要的类。

我注意到它与查询中语句的顺序有关。

这不是一个理想的行为,因为当我执行查询时,无论输入资源URI的顺序如何,我都希望它具有相同的结果。

有没有人遇到过这个问题,并为此找到了解决方案?

查询

以下查询正常运行,返回http://dbpedia.org/ontology/Filmhttp://dbpedia.org/ontology/Wikidata:Q11424作为结果:

SELECT ?lcs
WHERE
{
  <http://dbpedia.org/resource/Ice_Age_(2002_film)> a ?class1 .
  ?class1 rdfs:subClassOf* ?lcs .
  <http://dbpedia.org/resource/Finding_Nemo> a ?class2 .
  ?class2 rdfs:subClassOf* ?lcs .

  FILTER NOT EXISTS {
    <http://dbpedia.org/resource/Finding_Nemo> a ?class3 .
    ?class3 rdfs:subClassOf* ?sublcs .
    <http://dbpedia.org/resource/Ice_Age_(2002_film)> a ?class4 .
    ?class4 rdfs:subClassOf* ?sublcs .
    ?sublcs  rdfs:subClassOf ?lcs
  }

  FILTER strstarts(str(?lcs), "http://dbpedia.org/ontology")
}

但是,以下查询不返回任何内容:

SELECT ?lcs
WHERE
{
  <http://dbpedia.org/resource/Finding_Nemo> a ?class1 .
  ?class1 rdfs:subClassOf* ?lcs .
  <http://dbpedia.org/resource/Ice_Age_(2002_film)> a ?class2 .
  ?class2 rdfs:subClassOf* ?lcs .

  FILTER NOT EXISTS {
    <http://dbpedia.org/resource/Finding_Nemo> a ?class3 .
    ?class3 rdfs:subClassOf* ?sublcs .
    <http://dbpedia.org/resource/Ice_Age_(2002_film)> a ?class4 .
    ?class4 rdfs:subClassOf* ?sublcs .
    ?sublcs  rdfs:subClassOf ?lcs
  }

  FILTER strstarts(str(?lcs), "http://dbpedia.org/ontology")
}

1 个答案:

答案 0 :(得分:1)

  1. 您正在公共端点上运行查询,该端点具有各种自我保护设置。这意味着昂贵的查询可能会产生部分或无结果,而廉价的查询可能会产生完整的结果。您可以设置自己的镜像端点(quick-and-easy on Amazon EC2),但没有这样的保护,您应该看到等效查询的等效结果。

  2. @AKSW为您的查询提供了一个快速生成完整结果的调整 -

      

    FILTER strstarts(str(?sublcs), "http://dbpedia.org/ontology")添加到NOT EXISTS部分

    (请参阅query formlive results

    SELECT ?lcs
    WHERE
    {
      <http://dbpedia.org/resource/Finding_Nemo>  a  ?class1  .
      ?class1  rdfs:subClassOf*  ?lcs  .
      <http://dbpedia.org/resource/Ice_Age_(2002_film)>  a  ?class2  .
      ?class2  rdfs:subClassOf*  ?lcs  .
    
      FILTER NOT EXISTS {
        <http://dbpedia.org/resource/Finding_Nemo>  a  ?class3  .
        ?class3  rdfs:subClassOf*  ?sublcs  .
        <http://dbpedia.org/resource/Ice_Age_(2002_film)>  a  ?class4  .
        ?class4  rdfs:subClassOf*  ?sublcs .
        ?sublcs  rdfs:subClassOf  ?lcs 
        FILTER strstarts( str(?sublcs), "http://dbpedia.org/ontology" )
      }
    
      FILTER strstarts( str(?lcs), "http://dbpedia.org/ontology" )
    }
    
  3. (ObDisclaimer:OpenLink Software生成Virtuoso,它为DBpedia端点和AMI referenced above提供支持。他们也雇佣我。)