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