【问题标题】:Using OPTIONAL and UNION in SPARQL在 SPARQL 中使用 OPTIONAL 和 UNION
【发布时间】:2016-12-07 10:39:03
【问题描述】:

我想编写一个查询来获取与电影相关的实体的三元组。这是查询:

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 {
  {?o2 ?p21 ?o21}
  UNION
  {?s21 ?p22 ?o2}
}

生成结果。我想了解为什么 OPTIONAL 子句会阻止生成结果以及如何解决该问题。

【问题讨论】:

  • Web 界面出现超时,这使得 Virtuoso 随时使用功能。

标签: sparql dbpedia linked-data


【解决方案1】:

尝试(注意:原始查询中的超时是由于放置 OPTIONAL CLAUSE 引起的笛卡尔积。):

SELECT DISTINCT ?s1  WHERE 
  {
    dbr:Braveheart ?p ?o
    OPTIONAL 
      {
        {
          {?s1 ?p3 ?o}
          UNION
          {
            {?o ?p2 ?o2 }
            OPTIONAL 
              {
                {?o2 ?p21 ?o21}
                UNION
                {?s21 ?p22 ?o2}
              }
          }
        }
      } 
  }

链接:

【讨论】:

    【解决方案2】:

    我不知道你在哪里提出了这个查询(我假设是 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:narrator”而不是“?p”,您将看到结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 2019-08-23
      相关资源
      最近更新 更多