Re: Proposal for "Repeated Property" Requirement - sh:partition

Holger,

If Eric confirms that this proposal satisfies his requirements, I
write a complete definition suitable for inclusion in the spec.

-- Arthur

On Sat, Sep 26, 2015 at 7:56 PM, Holger Knublauch
<holger@topquadrant.com> wrote:
> I would find it helpful to see a proper definition in the same format that
> we have in the spec right now, i.e. including a textual definition and
> SPARQL (as much as possible). I am unclear about the result output - is it
> really just a boolean right now?
>
> In terms of the URIs, shouldn't this property be called sh:partitions (with
> an 's') because it points at an rdf:List of sh:Partition instances (assuming
> we replace sh:QCC with sh:Partition)?
>
> Holger
>
>
> On 9/26/15 9:13 AM, Arthur Ryman wrote:
>>
>> I've been following the discussion about repeated properties and
>> qualified cardinality constraints, and would like to propose a new
>> SHACL language element, sh:partition, that I believe will satisfy the
>> requirements.
>>
>> I the use cases suggest that SHACL needs a way to say that a set of
>> nodes must be partitioned into a certain number of disjoint subsets.
>> Each subset contains nodes that satisfy certain constraints. Each
>> subset must satisfy certain cardinality constraints.
>>
>> In the case of repeated properties, we are looking at the set of all
>> values for a given property (or inverse property) of a given focus
>> node. Sets of nodes occur in other contexts and be need to be
>> similarly constrained.
>>
>> It would be a very good thing if a SHACL processor could efficiently
>> determine if a given set of nodes could be partitioned according to a
>> given partition spec.
>>
>> SHACL already has sh:minCount and sh:maxCount properties which apply
>> to sets of nodes.
>>
>> SHACL also already has many other properties that define constraints
>> on a given node. These are tests or checks that apply to a node and
>> are either true or false. Holger listed many of them, e.g.
>> - sh:allowedValues
>> - sh:class
>> - sh:datatype
>> - sh:directType
>> - sh:minLength
>> - sh:maxLength
>> - sh:nodeKind
>> - sh:maxExclusive etc
>> - sh:pattern
>>
>> I propose to define a new RDF type, sh:QCC for things that specify
>> qualified cardinality constraints. However, sh:QCC will normally be
>> understood from the context and do not need to appear explicitly in
>> the shapes graph.
>>
>> A sh:QCC may have:
>> - zero or one sh:minCount
>> - zero or one sh:maxCount
>> - zero or more node constraints, for the following list (and possibly
>> others that make sense)
>> - sh:shape
>> - sh:allowedValues
>> - sh:class
>> - sh:datatype
>> - sh:directType
>> - sh:minLength
>> - sh:maxLength
>> - sh:nodeKind
>> - sh:maxExclusive etc
>> - sh:pattern
>>
>> A partition is specified by an rdf:List of sh:QCC nodes. Define
>> sh:Partition to be this subclass of rdf:List. Again, sh:Partition need
>> no appear explicitly.
>> A constraint may have zero or more sh:partition properties whose
>> values are sh:Partition nodes. All must be satisfied.
>>
>> The interpretation of a sh:Partition node as a constraint is as follows:
>>
>> Let the given set of nodes be X.
>> Let the sh:Partition node be the list P = (qcc1, qcc2, ..., qccn).
>>
>> For each qcc in P do the following:
>>     Let Y be the subset of X that satisfies the node constraints in qcc.
>>     If Y violates the cardinality constraints of qcc then report a
>> violation and break.
>>     Otherwise remove Y from X and continue.
>> End for.
>> If X is not empty then report a violation.
>> Otherwise report that P is satisfied.
>>
>> Note that this is a greedy algorithm. Each qcc in the list is matched
>> to the fullest extent. Nodes that match one qcc are removed from
>> further consideration. Also, the qcc's are checked in the order given
>> in the list so there is no combinatorial explosion.
>>
>> Eric proposed the following example [1]:
>>
>> <BFPersonInterface1> sh:property [
>>        sh:predicate bf:identifiedBy ; sh:pattern "^http://id.loc.gov/" ;
>>        sh:minCount 1 ; sh:maxCount 1
>>      ], [
>>        sh:predicate bf:identifiedBy ; sh:pattern "^http://viaf.org/" ;
>>        sh:minCount 1
>>      ] .
>>
>> In my proposal, this becomes:
>>
>> <BFPersonInterface1> sh:property [
>>        sh:predicate bf:identifiedBy ;
>>        sh:partition (
>>           [sh:pattern "^http://id.loc.gov/" ; sh:minCount 1 ; sh:maxCount
>> 1],
>>           [sh:pattern "^http://viaf.org/" ; sh:minCount 1 ]
>>        ) .
>>
>> [1]
>> https://lists.w3.org/Archives/Public/public-data-shapes-wg/2015Sep/0107.html
>>
>> -- Arthur
>>
>
>

Received on Sunday, 27 September 2015 22:10:12 UTC