如何使用SPARQL获取RDF数据集属性的minCardinality与maxCardinality?
如何用SPARQL统计数据集中属性的最小和最大基数?
要实现列出数据集中所有属性的最小基数(minCardinality)和最大基数(maxCardinality),且当部分主体未包含某属性时,该属性的最小基数视为0,可以使用以下SPARQL查询:
SELECT ?property (MIN(?count) AS ?minCardinality) (MAX(?count) AS ?maxCardinality) WHERE { # 提取数据集中所有唯一主体 { SELECT DISTINCT ?s WHERE { ?s ?p ?o } } # 提取数据集中所有唯一属性 { SELECT DISTINCT ?property WHERE { ?s ?property ?o } } # 匹配主体的属性取值(无取值时返回空) OPTIONAL { ?s ?property ?o } # 统计单个主体对应属性的取值数量,无取值则为0 BIND(COUNT(?o) AS ?count) } GROUP BY ?property ORDER BY ?property
查询逻辑说明
- 覆盖所有主体-属性组合:通过两个子查询分别获取数据集中所有唯一的主体和属性,确保每个属性与每个主体的组合都被统计到。
- 单主体属性计数:
OPTIONAL关键字处理主体无对应属性的场景,COUNT(?o)会自动返回0;若有取值则统计具体数量。 - 全局基数计算:按属性分组后,用
MIN(?count)得到该属性在所有主体中的最小出现次数,MAX(?count)得到最大出现次数。
示例数据集验证结果
将上述查询运行在你提供的FOAF数据集上,会得到如下结果:
| 属性(property) | 最小基数(minCardinality) | 最大基数(maxCardinality) |
|---|---|---|
| http://xmlns.com/foaf/0.1/familyName | 1 | 1 |
| http://xmlns.com/foaf/0.1/knows | 0 | 2 |
内容的提问来源于stack exchange,提问作者Martynas Jusevičius
相关产品推荐
相关产品推荐

