在SPARQL中使用可选和并集
我想写一个查询来获取与电影相关的实体的三元组。以下是查询:在SPARQL中使用可选和并集,sparql,dbpedia,linked-data,Sparql,Dbpedia,Linked Data,我想写一个查询来获取与电影相关的实体的三元组。以下是查询: PREFIX dbo: <http://dbpedia.org/ontology/> PREFIX : <http://dbpedia.org/resource/> SELECT DISTINCT ?s1 WHERE { SERVICE <http://dbpedia.org/sparql/> { ?film ?p ?o FILTER (?film = :Braveheart) . OPTIO
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX : <http://dbpedia.org/resource/>
SELECT DISTINCT ?s1 WHERE {
SERVICE <http://dbpedia.org/sparql/> {
?film ?p ?o
FILTER (?film = :Braveheart) .
OPTIONAL {
{
{
{?o ?p2 ?o2 .}
OPTIONAL {
{?o2 ?p21 ?o21}
UNION
{?s21 ?p22 ?o2}
}
}
UNION
{?s1 ?p3 ?o}
}
}
}
}
生成结果。我想了解为什么
OPTIONAL
子句阻止生成结果,以及如何解决问题 我不知道您在哪里提出了这个查询(我假设Sparql端点),它意味着什么,不获取任何结果,但我已经编写了一个稍微简单一点的查询,如下所示,并在端点上执行:
SELECT DISTINCT ?s1 WHERE {
dbr:Braveheart ?p ?o
OPTIONAL {
{
{
{?o ?p2 ?o2 .}
OPTIONAL {
{?o2 ?p21 ?o21}
UNION
{?s21 ?p22 ?o2}
}
}
UNION
{?s1 ?p3 ?o}
}
}
}
由于超时,它不会返回结果。否则,OPTIONAL子句就没有问题了。例如,如果将“dbo:叙述者”而不是“?p”,您将看到结果。尝试(注意:原始查询中的超时是由于放置可选子句而产生的笛卡尔积):
链接:
SELECT DISTINCT ?s1 WHERE {
dbr:Braveheart ?p ?o
OPTIONAL {
{
{
{?o ?p2 ?o2 .}
OPTIONAL {
{?o2 ?p21 ?o21}
UNION
{?s21 ?p22 ?o2}
}
}
UNION
{?s1 ?p3 ?o}
}
}
}
SELECT DISTINCT ?s1 WHERE
{
dbr:Braveheart ?p ?o
OPTIONAL
{
{
{?s1 ?p3 ?o}
UNION
{
{?o ?p2 ?o2 }
OPTIONAL
{
{?o2 ?p21 ?o21}
UNION
{?s21 ?p22 ?o2}
}
}
}
}
}