Re: shapes-ISSUE-209 (What is a shape?): What is a shape [SHACL Spec]

My question was about what happens in validation/conformance checking when a shape refers to another shape or to a constraint and information about that other shape or constraint is not provided in the shapes graph.

For example, if the shapes graph contains the following ex:PersonShape and has no further information about ex:OrganizationShape.

>>> ex:PersonShape
>>>        a sh:Shape ;
>>>        sh:targetClass ex:Person ;
>>>        sh:property [
>>>            sh:predicate ex:worksFor;
>>>            sh:shape ex:OrganizationShape;
>>> ].


I understood the answer to be that such “references” do not result in any errors. They also (obviously) do not result in any non conformance since the information provided does not let us to determine non conformance.

Thus, given the shapes graph above and the following data graph, 

{ex:Person1 a ex:Person.
ex:Person1 ex:worksFor ex:UnknownThing.}


SHACL processor will accept the shapes graph as being structurally fine and will determine that ex:Person1 conforms to ex:PersonShape.

I have no further questions.

As for “what are all the triples that describe a shape”, I don’t have such a question and find it clear. I believe you start with a node that is a shape and follow its properties to gather all information about the shape that is necessary to determine which data nodes should be validated against the shape and whether such data nodes conform to the shape.

If some people believe this is an important question that is insufficiently clear to several of the working group members, I would recommend following the approach taken by the OWL spec and defining something like “shape description”. This is a lukewarm recommendation as (1) I don’t see why this topic needs clarifying and (2) any attempt to further clarify may add some new potential for confusion. In fact, I found several confusing passages with respect to class description/definition in OWL specifications.

Irene

> On Nov 27, 2016, at 10:16 AM, Karen Coyle <kcoyle@kcoyle.net> wrote:
> 
> 
> 
> On 11/26/16 3:08 PM, Holger Knublauch wrote:
>> 
>> 
>> On 25/11/2016 5:41, Irene Polikoff wrote:
>>> I took the initial question to be "when is a resource (or a node) a
>>> shape?". And not to be "what are all the triples that describe a shape?".
>>> 
>>> To me, these are two completely different questions. Colloquially
>>> speaking, shape may be said to be a set of triples. But writing a spec
>>> requires us to be precise. And precisely speaking, shape is not a set
>>> of triples, it is a node. Information about it is
>>> described/specified/defined using a set of triples.
>>> 
>>> Thus, I would recommend closing the first question as resolved.
>>> 
>>> As for the second question, why does it need to be answered? A more
>>> meaningful question may be "when is a shape graph sufficiently
>>> complete to be able to process it and what should a SHACL processor do
>>> when a shapes graph doesn't have all the necessary information"?
>>> 
>>> For example, let's say a shapes graph contains only the following triples:
>>> 
>>> ex:PersonShape
>>>        a sh:Shape ;
>>>        sh:targetClass ex:Person ;
>>>        sh:property [
>>>            sh:predicate ex:worksFor;
>>>            sh:shape ex:OrganizationShape;
>>> ].
>>> 
>>> This, to me, would be insufficient to do anything with since to
>>> validate data against it, we need to have a description of
>>> ex:OrganizationShape. What should happen in such cases?
>> 
>> This case is covered by the spec. It's simply a shape without
>> constraints, i.e. every node conforms to it. Yet it's syntactically
>> valid because the expected type of sh:shape is sh:Shape.
>> 
>>> 
>>> 
>>> Other examples mentioned by Karen:
>>> 
>>> ex:ExampleShapeWithPropertyConstraints
>>>        a sh:Shape ;
>>>        sh:property [
>>>                sh:predicate ex:email ;
>>>                sh:name "e-mail" ;
>>>                sh:description "We need at least one email value" ;
>>>                sh:minCount 1 ;
>>>        ] ;
>>>        sh:property [
>>>                sh:path (ex:knows ex:email) ;
>>>                sh:name "Friend's e-mail" ;
>>>                sh:description "We need at least one email for
>>> everyone you know" ;
>>>                sh:minCount 1 ;
>>>        ] .
>>> 
>>> There is only one shape - ex:ExampleShapeWithPropertyConstraints. If
>>> this is all the content of a shapes graph, it is fine. All the
>>> information needed for validation is here.
>>> 
>>> ex:MyShape
>>>        a sh:Shape ;
>>>        sh:targetNode ex:MyInstance ;
>>>        sh:property [
>>>                # Violations of sh:minCount and sh:datatype are
>>> produced as warnings
>>>                sh:predicate ex:myProperty ;
>>>                sh:minCount 1 ;
>>>                sh:datatype xsd:string ;
>>>                sh:severity sh:Warning ;
>>>        ] ;
>>> 
>>> One shape - ex:MyShape. It refers to a target node. Target node is not
>>> a shape, it identifies a node in a data graph that is to be validated
>>> against a shape, so I am not sure what is the question.
>>> 
>>> ex:PersonShape
>>>        a sh:Shape ;
>>>        sh:targetClass ex:Person ;
>>>        sh:property ex:PersonShape-name .
>>> 
>>> ex:PersonShape-name
>>>        a sh:PropertyConstraint ;
>>>        sh:predicate ex:name ;
>>>        sh:minCount 1 ;
>>>        sh:deactivated true .
>>> 
>>> There is only one shape - ex:PersonShape. All the information
>>> necessary for validation is present and, in fact, there would be
>>> automatic conformance since the only constraint is disabled. However,
>>> if a shapes graph only contained the following, validation would not
>>> be possible (I think):
>>> 
>>> ex:PersonShape
>>>        a sh:Shape ;
>>>        sh:targetClass ex:Person ;
>>>        sh:property ex:PersonShape-name .
>>> 
>>> So, again, what should happen in these cases?
>>> 
>>> All the examples above are for a single shape. In some of the examples
>>> information about it is complete enough to validate data against the
>>> shape. In others, it is not. We should also consider the fact that a
>>> shapes graph can and often will contain multiple shapes and some
>>> shapes may have sufficient description to validate against and others
>>> may not. Also, some shapes may have some information that can be
>>> checked and some that can't be. For example, given the shape graph
>>> below we would know enough to check conformance of values of ex:email,
>>> but not know enough to check values of ex:worksFor.
>>> 
>>> ex:PersonShape
>>>        a sh:Shape ;
>>>        sh:targetClass ex:Person ;
>>>        sh:property [
>>>            sh:predicate ex:worksFor;
>>>            sh:shape ex:OrganizationShape;
>>> ];
>>> 
>>>        sh:property [
>>>                sh:path (ex:knows ex:email) ;
>>>                sh:name "Friend's e-mail" ;
>>>                sh:description "We need at least one email for
>>> everyone you know" ;
>>>                sh:minCount 1 ;
>>>        ] .
>>> 
>>> So, one proposal may be as follows:
>>> 
>>> If a shapes graph contains any shapes that are insufficiently
>>> specified, processing doesn't happen and SHACL engine returns an error.
>> 
>> The spec mentions several conditions under which a shapes graph is
>> invalid. These are typically written as "a shape must ...".
>> 
>> On the more general topic of node vs triples, I find this rather
>> philosophical. The spec is pretty clear about what happens in each
>> context. Which triples "belong" to a shape is following from that, but
>> not valuable on its own right.
> 
> The spec is not "pretty clear" and this is not "philosophical" - it has to be clear *to all* what is being described in the spec. Insisting that the spec is ok when others are saying it is not is one of the things that is making the progress very slow. It is incredibly generous of people to be putting time into trying to make it actually clear, but, personally, I'm running out of steam. However, note that DCMI will not approve a highly flawed spec.
> 
> kc
> 
>> 
>> Holger
>> 
>> 
>>> 
>>> Another proposal may be:
>>> 
>>> Data is processed against shapes that are sufficiently specified.
>>> Warning is issued regarding shapes that are insufficiently specified
>>> and, thus, ignored.
>>> 
>>> Yet another proposal may be:
>>> 
>>> Data is processed against shapes that are sufficiently specified.
>>> Warning is issued regarding shapes that are insufficiently specified.
>>> SHACL processor will perform as much validation as it able to against
>>> insufficiently specified shapes.
>>> 
>>> Of course, we would need to define what it means to be "insufficiently
>>> specified".
>>> 
>>> 
>>> On Thu, Nov 24, 2016 at 12:29 PM, Karen Coyle <kcoyle@kcoyle.net
>>> <mailto:kcoyle@kcoyle.net <mailto:kcoyle@kcoyle.net>>> wrote:
>>> 
>>>    Actually, I don't think this solves the problem that came up at
>>>    the meeting. As we discussed in the meeting, the conflict is
>>>    between a node, which is a single IRI, and a graph, which is a set
>>>    of triples. Throughout the document, the term "shape" is used to
>>>    refer to more than a single IRI.
>>> 
>>>    The statement below could be used for how a shape is identified
>>>    (although I think we should discuss that further) but does not
>>>    define how one finds the finite boundaries of the set of triples
>>>    that is used as an instrument to define the validation rules that
>>>    will be applied to a data graph.
>>> 
>>>    Something that was said in the meeting made me think that defining
>>>    where a shape ends is as important as defining where it begins.
>>>    (Note that in this case I am speaking of a shape as a set of
>>>    triples, not a node - we know where a node ends, because it is a
>>>    single point.)
>>> 
>>>    In an example like this (taken from the spec), I assume that this
>>>    represents a single shape:
>>> 
>>>    ex:ExampleShapeWithPropertyConstraints
>>>            a sh:Shape ;
>>>            sh:property [
>>>                    sh:predicate ex:email ;
>>>                    sh:name "e-mail" ;
>>>                    sh:description "We need at least one email value" ;
>>>                    sh:minCount 1 ;
>>>            ] ;
>>>            sh:property [
>>>                    sh:path (ex:knows ex:email) ;
>>>                    sh:name "Friend's e-mail" ;
>>>                    sh:description "We need at least one email for
>>>    everyone you know" ;
>>>                    sh:minCount 1 ;
>>>            ] .
>>> 
>>>    Where there is a target, which is also a shape, is this one or two
>>>    shapes? And if two, what are the boundaries of each?
>>> 
>>>    ex:MyShape
>>>            a sh:Shape ;
>>>            sh:targetNode ex:MyInstance ;
>>>            sh:property [
>>>                    # Violations of sh:minCount and sh:datatype are
>>>    produced as warnings
>>>                    sh:predicate ex:myProperty ;
>>>                    sh:minCount 1 ;
>>>                    sh:datatype xsd:string ;
>>>                    sh:severity sh:Warning ;
>>>            ] ;
>>> 
>>>    The following is an example of the case that I believe was
>>>    intended at the meeting. The question is whether this is one shape
>>>    or two? And if it is two, how is that distinguished from the shape
>>>    immediately above that has a target?
>>> 
>>>    ex:PersonShape
>>>            a sh:Shape ;
>>>            sh:targetClass ex:Person ;
>>>            sh:property ex:PersonShape-name .
>>> 
>>>    ex:PersonShape-name
>>>            a sh:PropertyConstraint ;
>>>            sh:predicate ex:name ;
>>>            sh:minCount 1 ;
>>>            sh:deactivated true .
>>> 
>>>    If this seems petty, remember that throughout, the document refers
>>>    to a thing called "shape" and all of the understanding of the
>>>    document depends on the reader understanding exactly what that means.
>>> 
>>>    kc
>>> 
>>>    On 11/23/16 7:34 PM, Holger Knublauch wrote:
>>> 
>>>        Done.
>>> 
>>>        Thanks,
>>>        Holger
>>> 
>>> 
>>>        On 24/11/2016 13:32, Irene Polikoff wrote:
>>> 
>>>            I suggest changing
>>> 
>>>            <A shape can be a node
>>>            <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-node <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-node>
>>>            <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-node <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-node>>>
>>>            in
>>>            a shapes graph
>>>            <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-shapes-graph <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-shapes-graph>
>>>            <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-shapes-graph <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-shapes-graph>>>.
>>>            A node is a shape if and only if it fulfills either of the
>>>            following
>>>            conditions in the shapes graph:>
>>> 
>>>            to
>>> 
>>>            <A shape is a node
>>>            <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-node <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-node>
>>>            <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-node <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-node>>>
>>>            in
>>>            a shapes graph
>>>            <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-shapes-graph <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-shapes-graph>
>>>            <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-shapes-graph <https://mail.google.com/mail/u/0/#m_1017120090268237992_dfn-shapes-graph>>>
>>>            that
>>>            fulfills either of the following conditions:
>>> 
>>>            On Wed, Nov 23, 2016 at 7:48 PM, Holger Knublauch
>>>            <holger@topquadrant.com <mailto:holger@topquadrant.com> <mailto:holger@topquadrant.com <mailto:holger@topquadrant.com>>
>>>            <mailto:holger@topquadrant.com <mailto:holger@topquadrant.com>
>>>            <mailto:holger@topquadrant.com <mailto:holger@topquadrant.com>>>> wrote:
>>> 
>>>                The current definition in 2.1 reads
>>> 
>>>                A shape can be a node <#m_1017120090268237992_dfn-node> in
>>>                a shapes graph
>>>            <#m_1017120090268237992_dfn-shapes-graph> that is
>>>                a SHACL instance
>>>                <#m_1017120090268237992_dfn-shacl-instance> of
>>>            |sh:Shape|; or it
>>>                can be a node so that the expected type
>>>                <#m_1017120090268237992_dfn-expected-type> of the node
>>>                is |sh:Shape|, or a node that has a value
>>>                <#m_1017120090268237992_dfn-values> for a target
>>>                <#m_1017120090268237992_dfn-target> property such
>>>                as |sh:targetClass| in the shapes graph
>>>                <#m_1017120090268237992_dfn-shapes-graph>.
>>> 
>>>                These are all (3) ways of how shapes are identified. I
>>>            have just
>>>                added some precision based on the newly introduced term
>>>                shape-expecting constraint parameters, and explicitly
>>>            enumerated
>>>                the target properties. The definition now reads
>>> 
>>>                A shape can be a node <#m_1017120090268237992_dfn-node> in
>>>                a shapes graph
>>>            <#m_1017120090268237992_dfn-shapes-graph>. A node
>>>                is a shape if and only if it fulfills either of the
>>>            following
>>>                conditions in the shapes graph:
>>> 
>>>                  * the node is a SHACL instance
>>>                    <#m_1017120090268237992_dfn-shacl-instance> of
>>>            |sh:Shape|
>>>                  * the node has the expected type
>>>                    <#m_1017120090268237992_dfn-expected-type>
>>>            |sh:Shape|, which
>>>                    is the case if it is used as a value of
>>>            shape-expecting
>>>                    constraint parameters
>>> 
>>>            <#m_1017120090268237992_dfn-shape-expecting-constraint-parameters>
>>>            such
>>>                    as |sh:shape| (in the case of the list-valued
>>>                    parameters |sh:and|, |sh:or| and |sh:partition| it
>>>            must be a
>>>                    member of the corresponding lists)
>>>                  * the node has a value
>>>            <#m_1017120090268237992_dfn-values> for
>>>                    any of the target
>>>                    <#m_1017120090268237992_dfn-target> properties
>>>            |sh:targetClass|, |sh:targetNode|, |sh:targetObjectsOf|,
>>>            |sh:targetSubjectsOf| and |sh:target|
>>> 
>>> 
>>>                Change:
>>> 
>>> 
>>>            https://github.com/w3c/data-shapes/commit/bec7b6852529acc80954dbc38cf4e435861238a2 <https://github.com/w3c/data-shapes/commit/bec7b6852529acc80954dbc38cf4e435861238a2>
>>>            <https://github.com/w3c/data-shapes/commit/bec7b6852529acc80954dbc38cf4e435861238a2 <https://github.com/w3c/data-shapes/commit/bec7b6852529acc80954dbc38cf4e435861238a2>>
>>> 
>>>            <https://github.com/w3c/data-shapes/commit/bec7b6852529acc80954dbc38cf4e435861238a2 <https://github.com/w3c/data-shapes/commit/bec7b6852529acc80954dbc38cf4e435861238a2>
>>>            <https://github.com/w3c/data-shapes/commit/bec7b6852529acc80954dbc38cf4e435861238a2 <https://github.com/w3c/data-shapes/commit/bec7b6852529acc80954dbc38cf4e435861238a2>>>
>>> 
>>>                I'd appreciate if WG members could double check this
>>>            definition.
>>>                Meanwhile I have turned the change above into a
>>>            PROPOSAL for a
>>>                future meeting:
>>> 
>>> 
>>>            https://www.w3.org/2014/data-shapes/wiki/Proposals#ISSUE-209:_What_is_a_shape <https://www.w3.org/2014/data-shapes/wiki/Proposals#ISSUE-209:_What_is_a_shape>
>>>            <https://www.w3.org/2014/data-shapes/wiki/Proposals#ISSUE-209:_What_is_a_shape <https://www.w3.org/2014/data-shapes/wiki/Proposals#ISSUE-209:_What_is_a_shape>>
>>> 
>>>            <https://www.w3.org/2014/data-shapes/wiki/Proposals#ISSUE-209:_What_is_a_shape <https://www.w3.org/2014/data-shapes/wiki/Proposals#ISSUE-209:_What_is_a_shape>
>>>            <https://www.w3.org/2014/data-shapes/wiki/Proposals#ISSUE-209:_What_is_a_shape <https://www.w3.org/2014/data-shapes/wiki/Proposals#ISSUE-209:_What_is_a_shape>>>
>>> 
>>>                Thanks,
>>>                Holger
>>> 
>>> 
>>> 
>>>                On 24/11/2016 9:49, Irene Polikoff wrote:
>>> 
>>>                    I believe the question is "How do I know that a
>>>                node is a
>>>                    shape?". The spec says that it is "typically" a
>>>                SHACL instance of
>>>                    sh:Shape. This is one way, but not the definitive
>>>                way (because of
>>>                    "typically") to determine that something is a shape.
>>> 
>>>                    What are other ways? E.g., any subject of a triple
>>>                with one of
>>>                    the SHACL target or constraint predicates is a shape.
>>> 
>>>                    On Sun, Nov 20, 2016 at 3:58 PM, RDF Data Shapes
>>>                Working Group
>>>                    Issue Tracker <sysbot+tracker@w3.org <mailto:sysbot+tracker@w3.org>
>>>                <mailto:sysbot%2Btracker@w3.org <mailto:2Btracker@w3.org>>
>>>                    <mailto:sysbot+tracker@w3.org <mailto:sysbot+tracker@w3.org>
>>>                <mailto:sysbot%2Btracker@w3.org <mailto:2Btracker@w3.org>>>> wrote:
>>> 
>>>                        shapes-ISSUE-209 (What is a shape?): What is a
>>>                shape [SHACL Spec]
>>> 
>>> 
>>>                http://www.w3.org/2014/data-shapes/track/issues/209 <http://www.w3.org/2014/data-shapes/track/issues/209>
>>>                <http://www.w3.org/2014/data-shapes/track/issues/209 <http://www.w3.org/2014/data-shapes/track/issues/209>>
>>> 
>>>                <http://www.w3.org/2014/data-shapes/track/issues/209 <http://www.w3.org/2014/data-shapes/track/issues/209>
>>>                <http://www.w3.org/2014/data-shapes/track/issues/209 <http://www.w3.org/2014/data-shapes/track/issues/209>>>
>>> 
>>>                        Raised by: Karen Coyle
>>>                        On product: SHACL Spec
>>> 
>>>                        Peter's mail:
>>> 
>>>                https://lists.w3.org/Archives/Public/public-rdf-shapes/2016Oct/0029.html <https://lists.w3.org/Archives/Public/public-rdf-shapes/2016Oct/0029.html>
>>>                <https://lists.w3.org/Archives/Public/public-rdf-shapes/2016Oct/0029.html <https://lists.w3.org/Archives/Public/public-rdf-shapes/2016Oct/0029.html>>
>>> 
>>>                <https://lists.w3.org/Archives/Public/public-rdf-shapes/2016Oct/0029.html
>>>                <https://lists.w3.org/Archives/Public/public-rdf-shapes/2016Oct/0029.html>>
>>> 
>>>                        "Just what are shapes?
>>> 
>>>                        The terminology section says:
>>> 
>>>                        "Shape
>>>                        A shape is a node in a shapes graph that is
>>>                typically a SHACL
>>>                        instance of
>>>                        sh:Shape. A shape provides a collection of
>>>                targets, filters,
>>>                        constraints and
>>>                        parameters of constraint components that
>>>                specify how a data
>>>                        graph is
>>>                        validated against the shape. Shapes can also
>>>                provide
>>>                        non-validating
>>>                        information, such as labels and comments."
>>> 
>>>                        Section 2 says:
>>> 
>>>                        "Shapes define constraints that a set of focus
>>>                nodes can be
>>>                        validated
>>>                        against."
>>> 
>>>                        This doesn't, however, provide guidance in
>>>                determining what
>>>                        the shapes in a
>>>                        shapes graph are."
>>> 
>>>                        (more in the email)
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>>    --
>>>    Karen Coyle
>>>    kcoyle@kcoyle.net <mailto:kcoyle@kcoyle.net> <mailto:kcoyle@kcoyle.net <mailto:kcoyle@kcoyle.net>> http://kcoyle.net <http://kcoyle.net/>
>>>    m: 1-510-435-8234 <tel:1-510-435-8234>
>>>    skype: kcoylenet/+1-510-984-3600 <tel:%2B1-510-984-3600>
>>> 
>>> 
>> 
> 
> -- 
> Karen Coyle
> kcoyle@kcoyle.net <mailto:kcoyle@kcoyle.net> http://kcoyle.net <http://kcoyle.net/>
> m: 1-510-435-8234
> skype: kcoylenet/+1-510-984-3600

Received on Sunday, 27 November 2016 18:01:42 UTC