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