您将如何在 SPARQL 中处理此问题:列出数据集中使用的属性及其各自的最小/最大基数?
例如,给定这个示例 RDF 数据集:
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
<https://www.w3.org/People/Berners-Lee/card#i> foaf:familyName "Berners-Lee" ;
foaf:knows <http://danbri.org/foaf#danbri> ,
<http://dig.csail.mit.edu/2008/webdav/timbl/foaf.rdf#libby> .
<http://danbri.org/foaf#danbri> foaf:familyName "Brickley" ;
foaf:knows <http://dig.csail.mit.edu/2008/webdav/timbl/foaf.rdf#libby> .
<http://dig.csail.mit.edu/2008/webdav/timbl/foaf.rdf#libby> foaf:familyName "Miller" .
结果应该是这样的:
财产 | 最小基数 | 最大基数 |
---|---|---|
http://xmlns.com/foaf/0.1/familyName | 1 | 1 |
http://xmlns.com/foaf/0.1/knows | 0 | 2 |
此查询:
SELECT (?p AS ?property) (MIN(?c) AS ?minCardinality) (MAX(?c) AS ?maxCardinality)
{
SELECT ?s ?p (count(?o) AS ?c) {
{ SELECT DISTINCT ?p { [] ?p [] }}
{ SELECT DISTINCT ?s { ?s ?p [] }}
OPTIONAL { ?s ?p ?o }
}
GROUP BY ?s ?p
}
GROUP BY ?p
给出这个结果(使用 Jena):
----------------------------------------------------------------------------
| property | minCardinality | maxCardinality |
============================================================================
| <http://xmlns.com/foaf/0.1/familyName> | 1 | 1 |
| <http://xmlns.com/foaf/0.1/knows> | 0 | 2 |
----------------------------------------------------------------------------