SPARQL:有没有一种方法可以在属性上进行透视



我正在查询一个具有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.
} 

查询返回如下内容:

关系
版本lg计数
"20210601">";id">反义词4
"20210601">";id">近似同义词0
"20210601">";id">超名称0
"20210601">";id">同义词108
"20150602">";id">反义词2
"20150602">";id">近似同义词0
"20150602">";id">超名称0
"20150602">";id">同义词36
"20150702">";id">反义词2
"20150702">";id">近似同义词0
"20150702">";id">超名称0
"20150702">";id">同义词36

您需要组合不同观测值。如果对查询中的关系名称进行硬编码不是太不切实际,那么可以编写单独的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 
}

这要求提供每个版本/语言组合的所有统计数据;否则就不会有这种组合的解决方案。

备选方案

如果关系类型太多,可以使用以下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)
} 

最新更新