sparql - 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 |
我想以关系的值为中心得到下表:
版本 | lg | 反义词 | 近似同义词 | 上位词 | 代名词 |
---|---|---|---|---|---|
“20210601” | “ID” | 4 | 0 | 0 | 108 |
“20150602” | “ID” | 2 | 0 | 0 | 36 |
“20150702” | “ID” | 2 | 0 | 0 | 36 |
我找不到一种方法来制作单个 SPARQL 查询来获得这个。目前,我需要使用我使用的任何客户端语言(此处为 python)获取所有数据并进行数据透视。
这在 SPARQL 1.1 中可行吗?如何 ?
我宁愿有一个一般性的答案,但接入点目前由 Virtuoso 提供服务。
编辑:为了更好地解释我的期望。在 DataCube Vocabulary 中,DataCube 的结构被描述为给出不同的维度和度量(通常由本体)。因此,维度和度量被认为是查询开发者已知的(至少对于特定版本的本体而言)。
在这里,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
}
这要求每个版本/语言组合都存在所有统计信息;否则,该组合将没有解决方案。
选择
如果关系类型太多,您可以使用以下 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)
}
推荐阅读
- reactjs - 如何在 Meteor Method 完成之前禁用反应按钮
- pandas - 如何删除 Pandas 中的重复列?
- javascript - 在 req.body 中接收两个对象
- ios - 共享扩展模式演示样式 iOS 13 无法正常工作
- google-cloud-platform - 如何在模板之间共享架构?
- c - 维基百科的读写锁实现是否正确?
- javascript - 如何让屏幕阅读器停止将 HTML5 游戏视为文档?
- c - 这 3 行 C 代码自己做了什么,它们总共做了什么?
- swift - 由于换行导致的 Swift 字符串比较失败
- cloud-init - cloud-init 忽略静态 IP 网络配置