【问题标题】:SPARQL functions in CONSTRUCT/WHERECONSTRUCT/WHERE 中的 SPARQL 函数
【发布时间】:2016-02-02 05:42:33
【问题描述】:

我在处理查询时主要使用 SPARQL SELECT 进行调试,但最后我想以 CONSTRUCT 方式使用最终结果;因为我想使用图表而不是键/值查询结果。

我还没有得到(而且似乎无法通过搜索引擎/文档找到)是我是否也可以这样使用函数。例如,我使用属性路径将标题连接成“超字符串”,稍后我将使用它来构建 Lucene 索引以提高纯文本搜索质量:

PREFIX dc: <http://purl.org/dc/elements/1.1/>    

SELECT (group_concat(?title ; separator = " ") AS ?fancytitle) WHERE { 
  GRAPH ?graph {
    <http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163>  dc:relation+ ?relation .
    ?relation dc:title ?title .
  }
}

现在我想拥有相同的?fancytitle作为新的三元组

<http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> <fancytitle> ?fancytitle .

所以我可以将其直接存储在新图表中。这可能吗?我玩了一些查询,但无法让它被 SPARQL 处理器接受。仅供参考,我正在使用 Fuseki。

你可以在我的SPARQL Endpoint试试看

【问题讨论】:

    标签: rdf sparql fuseki


    【解决方案1】:

    是的,这是可能的

    您不能直接在CONSTRUCT 模板中使用表达式,但可以通过子查询中的SELECT 表达式或使用BINDWHERE 子句中分配变量。

    在您的情况下,GROUP_CONCAT 是一个聚合,它只能是一个 SELECT 表达式,因此您只需将整个 SELECT 作为子查询,例如

    PREFIX dc: <http://purl.org/dc/elements/1.1/>    
    
    CONSTRUCT
    {
      <http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163> <http://fancyTitle> ?fancytitle
    }
    WHERE
    {
      SELECT (group_concat(?title ; separator = " ") AS ?fancytitle) WHERE { 
        GRAPH ?graph {
          <http://data.staatsarchiv-bs.ch/id/archivalresource/CH-000027-1/pa-633c-a-312-fasc-163>  dc:relation+ ?relation .
          ?relation dc:title ?title .
        }
      }
    }
    

    以上在您的端点上运行良好

    【讨论】:

    • 虽然我已经在其他情况下使用了子查询,但我没有想到这一点,非常感谢!对于非聚合函数,BIND 看起来如何?
    • 后续问题,我还能用这个查询中的变量替换资源的URI吗?就像?resource a locah:ArchivalResource; - 我这样得到零结果。我想在所有 ArchivalResource 上执行此操作
    【解决方案2】:

    在我同事的帮助下,UNIONGROUP BY 是必不可少的。此查询将图表中所有locah:ArchivalResource 的字符串放在一起:

    CONSTRUCT
    {
      ?archresource skos:hiddenLabel ?supertitle
    }
    WHERE
    {
      SELECT ?archresource  (group_concat(?title ; separator = ", ") AS ?supertitle) WHERE {
        GRAPH ?graph {
          {
            SELECT ?title ?archresource WHERE {
              GRAPH ?graph {
                {
                  ?archresource a locah:ArchivalResource ;
                  dc:title ?title .
                } UNION
                {
                  ?archresource dc:relation+ ?relation .
                  ?relation dc:title ?title .
                }
              }
            }
          }
        }
      } GROUP BY ?archresource
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      相关资源
      最近更新 更多