- From: Holger Knublauch <holger@topquadrant.com>
- Date: Thu, 04 Jun 2015 09:16:22 +1000
- To: RDF Data Shapes Working Group <public-data-shapes-wg@w3.org>
I thought more about the issue of generic scopes and filters and have
come up with a variation of Peter's design. Assuming we define
- Scope: takes a graph as input and produces bindings for the focus node
(?this)
Graph -> focus nodes
- Constraint: that takes a focus node as input and produces (violation)
results:
focus nodes -> results
I think we should make Scopes an explicit concept in SHACL's RDF
vocabulary, similar to how shapes are defined. There would be the
following class hierarchy:
sh:Scope
sh:NativeScope
sh:TemplateScope
And native scopes can have sh:sparql (or a JS body etc). Example
# Applies to all subjects that have a skos:prefLabel
ex:MyShape
sh:scope [
a sh:NativeScope ; # Optional rdf:type triple
sh:sparql """
SELECT DISTINCT ?this
WHERE {
?this skos:prefLabel ?any
}
"""
] ;
sh:constraint [
a ex:UniqueLanguageConstraint ;
ex:predicate skos:prefLabel ;
] .
This (common) case above could be turned into a template sh:PropertyScope:
ex:MyShape
sh:scope [
a sh:PropertyScope ;
sh:predicate skos:prefLabel .
] ;
sh:constraint [
a ex:UniqueLanguageConstraint ;
ex:predicate skos:prefLabel ;
] .
and we could provide a small collection of frequently needed scopes, e.g.
- all nodes in a graph
- all subjects
- all nodes with any rdf:type
- all IRI nodes from a given namespace
Systems that don't speak SPARQL would rely on the hard-coded IRIs from
the core vocabulary, such as sh:PropertyScope.
We could now also formally define the scope behind sh:scopeClass (and
sh:nodeShape):
sh:ClassScope
a sh:TemplateScope ;
sh:argument [
sh:predicate sh:class ; # Becomes ?class
sh:valueType rdfs:Class ;
] ;
sh:sparql """
SELECT ?this
WHERE {
?type rdfs:subClassOf* ?class .
?this a ?type .
}
""" .
In addition to these scopes, I suggest we turn sh:scopeShape into
sh:filterShape, and use these filters as pre-conditions that are
evaluated for a given set of focus nodes. The workflow then becomes:
- sh:scope produces bindings for ?this
- sh:filterShape filters out the values of ?this that do not match
the given shape
- the actual constraints are evaluated
I believe this design provides the flexibility of a generic scoping
mechanism (as suggested in Peter's design) without getting into the
complexity of having to analyze SPARQL syntax or rely on hacks with
rdfs:Resource, while having a user-friendly syntax. The fact that we
separate sh:Scope from sh:Shape means that we can enforce different,
explicit semantics on scopes. For example we could allow a sh:Scope to
encapsulate another SPARQL query that tests whether a given ?this is in
scope, i.e. the inverse direction of the SELECT query, to optimize
performance.
Thanks,
Holger
Received on Wednesday, 3 June 2015 23:18:28 UTC