SPARQL 查询 returns 不同的结果取决于语句的顺序

SPARQL query returns different results depending on the order of statements

我有一个 SPARQL 查询,其中 returns 两个资源中最具体的 类。

当我在 https://dbpedia.org/sparql 上尝试 运行 时,有时它 returns 什么都没有,而其他时候它 returns 我想要的 类。

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

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

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

查询

以下查询正常工作,返回 http://dbpedia.org/ontology/Film and http://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")
}

但是,下面的查询returns什么都没有:

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. 您是 运行 您在 public 端点上的查询,该端点具有多种自我保护设置。这意味着昂贵的查询可能会产生部分结果或没有结果,而廉价的查询可能会产生完整的结果。您可以在没有此类保护的情况下设置自己的镜像端点 (quick-and-easy on Amazon EC2),您应该会看到等效查询的等效结果。

  2. @AKSW 对您的查询进行了调整,可以快速生成完整结果 --

    add FILTER strstarts(str(?sublcs), "http://dbpedia.org/ontology") to the NOT EXISTS part

    (参见 query form and live 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" )
    }
    

(ObDisclaimer:OpenLink Software produces Virtuoso, which powers the DBpedia endpoint, and the AMI referenced above。他们也雇用我。)