SPARQL:有没有办法以 属性 为中心?

SPARQL: Is there a way to pivot on a property?

我正在查询具有 3 个维度和 1 个度量的 DataCube(RDF 统计数据)。在这个数据立方体中,每个观察由 4 个语句组成(3 个用于维度,1 个用于度量,如下例(可以在 http://kaiko.getalp.org/sparql 查询)。

SELECT distinct ?version ?lg ?relation ?count WHERE {
  ?o a qb:Observation; 
    qb:dataSet dbnstats:dbnaryNymRelationsCube;
    dbnary:wiktionaryDumpVersion ?version;
    dbnary:observationLanguage ?lg;
    dbnary:nymRelation ?relation;
    dbnary:count ?count.
} 

查询 returns 类似于:

版本 lg 关系 计数
"20210601" “编号” 反义词 4
"20210601" “编号” 近似同义词 0
"20210601" “编号” 上位词 0
"20210601" “编号” 同义词 108
"20150602" “编号” 反义词 2
"20150602" “编号” 近似同义词 0
"20150602" “编号” 上位词 0
"20150602" “编号” 同义词 36
"20150702" “编号” 反义词 2
"20150702" “编号” 近似同义词 0
"20150702" “编号” 上位词 0
"20150702" “编号” 同义词 36

我想以关系的值为中心得到以下 table:

版本 lg 反义词 近似同义词 上位词 同义词
"20210601" “编号” 4 0 0 108
"20150602" “编号” 2 0 0 36
"20150702" “编号” 2 0 0 36

我找不到一种方法来制作单个 SPARQL 查询来获得它。目前,我需要获取所有数据并使用我使用的任何客户端语言制作数据透视表(此处 python)。

这在 SPARQL 1.1 中可行吗?怎么样?

我希望得到一个笼统的答案,但接入点目前由 Virtuoso 提供服务。

编辑:为了更好地解释我的期望。在 DataCube Vocabulary 中,描述了 DataCube 的结构,给出了不同的维度和度量(通常由 ontology)。因此,维度和度量被认为是查询开发者已知的(至少对于 ontology 的特定版本)。

这里,nymRelation 的 是事先不知道的,它们是数据的一部分而不是结构的一部分。 Pivot 操作似乎是对 DataCube 的有效操作(以及切片、投影等)。

我想知道是否可以在服务器上进行这样的操作(通过不依赖于服务器上实际数据的通用查询)。这将使客户端维护一个 LAZY 数据立方体对象并在确实需要结果时推迟实际的数据透视操作成为可能。

我怀疑(并且第一个答案似乎暗示)如果不获取整个 DataCube(以在客户端的内存中执行操作)或获取实际不同的 属性 值和自动创建一个将取决于第一个结果的查询。

您需要合并来自不同观察值的值。如果在查询中对关系名称进行硬编码不太不切实际,您可以编写单独的 SELECT 语句,为 ?version?lg 绑定一个公共值,以将计数拉入单个解决方案,像这样:

SELECT ?version ?lg ?antonym ?approximateSynonym # ...
WHERE {
  {
    SELECT ?version ?lg ?antonym
    WHERE
    {
      ?o1 a qb:Observation; 
        qb:dataSet dbnstats:dbnaryNymRelationsCube;
        dbnary:wiktionaryDumpVersion ?version;
        dbnary:observationLanguage ?lg;
        dbnary:nymRelation dbnary:antonym;
        dbnary:count ?antonym .   # <--- bind the antonym count value
    }
  } 

  {
    SELECT ?version ?lg ?approximateSynonym 
    WHERE
    {
      ?o2 a qb:Observation; 
        qb:dataSet dbnstats:dbnaryNymRelationsCube;
        dbnary:wiktionaryDumpVersion ?version;
        dbnary:observationLanguage ?lg;
        dbnary:nymRelation dbnary:approximateSynonym;
        dbnary:count ?approximateSynonym .   # <--- bind the approximateSynonym count
    }
  }

  # ... And so on for the other columns 
}

这要求每个 version/language 组合的所有统计信息都存在;否则该组合将无解。

备选

如果关系类型太多,可以使用以下CONSTRUCT查询将每一行的等价物聚合到它自己的类观察对象中。不同的属性将映射到相同的 ?rowURI。您可以将此结果解析为 RDF,或者如果您愿意,也可以只处理 json 序列化。

CONSTRUCT {
    ?rowURI 
       dbnary:wiktionaryDumpVersion ?version ;
       dbnary:observationLanguage ?lg ;
       ?relation ?count 
}
WHERE {
  ?o a qb:Observation; 
    qb:dataSet dbnstats:dbnaryNymRelationsCube;
    dbnary:wiktionaryDumpVersion ?version;
    dbnary:observationLanguage ?lg;
    dbnary:nymRelation ?relation;
    dbnary:count ?count.

    BIND(URI(CONCAT("http://example.org/row/", ?lg, ?version)) AS ?rowURI)
}