Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SPARQL查询根据语句的顺序返回不同的结果_Sparql_Dbpedia_Virtuoso - Fatal编程技术网

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

SPARQL查询根据语句的顺序返回不同的结果,sparql,dbpedia,virtuoso,Sparql,Dbpedia,Virtuoso,我有一个SPARQL查询,它返回两个资源中最具体的公共类 当我尝试运行它时,有时它什么也不返回,而有时它返回我想要的类 我注意到它与查询中语句的顺序有关 这不是一个理想的行为,因为当我执行查询时,我希望它具有相同的结果,而不管我输入资源URI的顺序如何 有没有人遇到过这个问题并找到了解决方案 查询 以下查询正常工作,并作为结果返回: SELECT ?lcs WHERE { <http://dbpedia.org/resource/Ice_Age_(2002_film)> a ?c

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

当我尝试运行它时,有时它什么也不返回,而有时它返回我想要的类

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

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

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

查询

以下查询正常工作,并作为结果返回:

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")
}
选择lcs
哪里
{
a?1级。
1类RDF:子类*?lcs。
a?2级。
?2类RDF:子类*?lcs。
筛选器不存在{
a?3班。
?3类RDF:子类*?子类。
a?四年级。
?第4类RDF:子类*?子类。
子类rdfs:子类lcs
}
过滤器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")
}
选择lcs
哪里
{
a?1级。
1类RDF:子类*?lcs。
a?2级。
?2类RDF:子类*?lcs。
筛选器不存在{
a?3班。
?3类RDF:子类*?子类。
a?四年级。
?第4类RDF:子类*?子类。
子类rdfs:子类lcs
}
过滤器strstarts(str(?lcs),”http://dbpedia.org/ontology")
}
  • 您正在公共端点上运行查询,该端点具有各种自我保护设置。这意味着昂贵的查询可能会产生部分或无结果,而便宜的查询可能会产生完整的结果。您可以在没有此类保护的情况下设置自己的镜像端点(),并且应该可以从等效查询中看到等效结果

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

    添加
    过滤器strstarts(str(?sublcs),”http://dbpedia.org/ontology“
    不存在的部分

    (见和)

    选择lcs
    哪里
    {
    a?1级。
    1类RDF:子类*?lcs。
    a?2级。
    ?2类RDF:子类*?lcs。
    筛选器不存在{
    a?3班。
    ?3类RDF:子类*?子类。
    a?四年级。
    ?第4类RDF:子类*?子类。
    子类rdfs:子类lcs
    过滤器strstarts(str(?sublcs),”http://dbpedia.org/ontology" )
    }
    过滤器strstarts(str(?lcs),”http://dbpedia.org/ontology" )
    }
    

  • (ObDisclaimer:products,它为DBpedia端点提供了动力。他们也雇佣了我。)

    由于某些原因,第二个查询更昂贵,而且Virtuoso无法在查询执行时间内找到您想要的内容。但是出于什么原因。。。我想原因是《海底总动员》中的
    rdf:type
    s(~55)的数量比冰河时代的
    rdf:type
    s(~35)的数量要多。顺便说一句,查询的SQL执行计划略有不同(请选中Generate SPARQL compilation report(而不是执行查询)以查看它们)。不要忘记Virtuoso具有anytime功能,web界面中的默认超时为30秒。正如StansilavKralin所说,尽管语义相当,三重模式的不同顺序可能导致不同的查询执行计划。顺便说一句,这是三重存储中最困难的部分,找到“最好的”并不是件小事(即使它存在),顺便说一句,你也可以添加一个过滤器
    过滤器strstarts(str(?sublcs),”http://dbpedia.org/ontology")
    到不存在的
    部分,因为您只对DBpedia本体感兴趣。或者更有效的方法是使用
    ?lcs a owl:Class.
    到查询的第一部分。只有DBpedia类才会加载这些模式三元组。是的,添加
    过滤器strstarts(str(?sublcs),”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(?sublcs), "http://dbpedia.org/ontology" )
      }
    
      FILTER strstarts( str(?lcs), "http://dbpedia.org/ontology" )
    }