- From: James Hudson <jameshudson3010@gmail.com>
- Date: Tue, 21 Apr 2020 13:39:49 -0400
- To: Irene Polikoff <irene@topquadrant.com>
- Cc: Public Shacl W3C <public-shacl@w3.org>
- Message-ID: <CAEUVO9FRFSB_XjC82sRmaXjxfvqEaV4F9Tm_zVwOmHXNT7n5ig@mail.gmail.com>
Hello Irene, Unfortunately, sh:path (rdf:type rdf:type); validates: hr:missing rdfs:comment "some comment about missing" . which does not have any value of rdf:type. This focus node should produce a validation error. I also believe that I would actually want ( rdf:type [sh:oneOrMorePath rdf:type] ) ; as the chain could be longer then just two. However, this does not resolve the problems. I tried: @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix sch: <http://schema.org/> . @prefix sh: <http://www.w3.org/ns/shacl#> . @prefix ex: <http://example.org/> . ex:ClassOrProperty a sh:PropertyShape ; sh:target [ a sh:SPARQLTarget ; sh:select """ SELECT ?this WHERE { ?this ?p ?o . } """ ; ] ; sh:path ( rdf:type [sh:oneOrMorePath rdf:type] ) ; sh:in ( rdfs:Class rdf:Property ) ; sh:maxCount 1 ; # path-maxCount sh:minCount 1 ; # PropertyShape-path-minCount . Hoping that I could say to validate where the property path terminates and that it has to contain at least one value found in sh:in, but this produced the unwanted validation error: Constraint Violation in MinCountConstraintComponent ( http://www.w3.org/ns/shacl#MinCountConstraintComponent): Severity: sh:Violation Source Shape: ex:ClassOrProperty Focus Node: hr:Employee Result Path: ( rdf:type rdf:type ) The only thing I need to be able to do is to validate where the property path terminates and that does not seem possible with SHACL. Based on that, I have to believe that my sh:path should be sh:path [sh:zeroOrMorePath rdf:type] ; to account for focus nodes which do not have a rdf:type defined. Unfortunately, SHACL requires that every node along a path be validated with the same test and cannot just validate where the property path terminates. Regards, James On Tue, Apr 21, 2020 at 1:18 PM Irene Polikoff <irene@topquadrant.com> wrote: > No, I meant sequence path without any zero or more or one or more. Simply > rdf:type/rdf:type as opposed to rdf:type+/rdf:type which doesn’t make much > sense. > > sh:path (rdf:type rdf:type); > > See https://www.w3.org/TR/shacl/#property-paths > > On Apr 21, 2020, at 12:56 PM, James Hudson <jameshudson3010@gmail.com> > wrote: > > Hello Irene, > > Thank you for your quickly reply. > > If I try: > > @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . > @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . > @prefix sch: <http://schema.org/> . > @prefix sh: <http://www.w3.org/ns/shacl#> . > @prefix ex: <http://example.org/> . > > ex:ClassOrProperty > a sh:PropertyShape ; > sh:target [ > a sh:SPARQLTarget ; > sh:select """ > SELECT ?this > WHERE { > ?this ?p ?o . > } > """ ; > ] ; > > > sh:path ( [sh:zeroOrMorePath rdf:type] rdf:type ) ; > sh:in ( rdfs:Class rdf:Property ) ; > . > > > which is what I think you mean by "rdf:type/rdf:type as the path", I still > get the following unexpected validation error: > > Constraint Violation in InConstraintComponent ( > http://www.w3.org/ns/shacl#InConstraintComponent): > Severity: sh:Violation > Source Shape: ex:ClassOrProperty > Focus Node: hr:Longer > Value Node: hr:Employee > Result Path: ( [ sh:zeroOrMorePath rdf:type ] rdf:type ) > > > By unexpected, I mean I do not want it to be considered a validation error > because the rdf:type property path terminates at rdfs:Class. > > When you say "zero or more paths will deliver values hr:Long, hr:Employee, > rdfs:Class," does that mean that the sh:in test will be performed on the > value of hr:Long (fail), hr:Employee (fail), and rdfs:Class (pass)? Is it > possible to have it validate only where the property path terminates? > > Regards, > James > > On Tue, Apr 21, 2020 at 12:12 PM Irene Polikoff <irene@topquadrant.com> > wrote: > >> This looks correct. >> >> With data: >> >> hr:Long a hr:Employee. >> hr:Employee a rdfs:Class. >> >> If your focus node is hr:Long, zero or more paths will deliver values >> hr:Long, hr:Employee, rdfs:Class. One or more paths will deliver values >> hr:Employee, rdfs:Class. >> >> You could try rdf:type/rdf:type as the path. This will get the type of a >> resource that is used as a type and ensure that it is rdfs:CLass or >> rdf:Property. >> >> On Apr 21, 2020, at 11:39 AM, James Hudson <jameshudson3010@gmail.com> >> wrote: >> >> Hello, >> >> Since people here have been so helpful in the past, I thought I would ask >> a few more questions. >> >> Background to this is my SO question at >> https://stackoverflow.com/questions/61323857/what-is-the-difference-between-these-shape-graphs-which-use-shor >> >> The SO question has the data graph under consideration. >> >> In the book Validating RDF, it says: >> >> Node shapes declare constraints directly on a node. Property shapes >> declare constraints on the values associated with a node through a path. >> >> >> Based on this, I believe I want to use a Property Shape because I want to >> define a constraint on the value of the rdf:type path on a focus node. Is >> this correct? >> >> If I try the property shape: >> >> @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . >> @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . >> @prefix sch: <http://schema.org/> . >> @prefix sh: <http://www.w3.org/ns/shacl#> . >> @prefix ex: <http://example.org/> . >> >> ex:ClassOrProperty >> a sh:PropertyShape ; >> sh:target [ >> a sh:SPARQLTarget ; >> sh:select """ >> SELECT ?this >> WHERE { >> ?this ?p ?o . >> } >> """ ; >> ] ; >> >> >> sh:path [sh:zeroOrMorePath rdf:type] ; >> sh:in ( rdfs:Class rdf:Property ) ; >> . >> >> >> I get the unexpected validation error: >> (J) >> >> Constraint Violation in InConstraintComponent ( >> http://www.w3.org/ns/shacl#InConstraintComponent): >> Severity: sh:Violation >> Source Shape: ex:ClassOrProperty >> Focus Node: hr:Longer >> Value Node: hr:Employee >> Result Path: [ sh:zeroOrMorePath rdf:type ] >> >> >> The way I thought [sh:zeroOrMorePath rdf:type] ; would work is that it >> would consider the node hr:Longer and follow the rdf:type path through >> hr:Employee to where it terminates at rdfs:Class and then validate. >> However, it seems to stop one step away, sees that hr:Employee is not a >> rdfs:Class or rdf:Property and then generates a validation error. >> >> I get another unexpected validation error: >> (K) >> >> Constraint Violation in InConstraintComponent ( >> http://www.w3.org/ns/shacl#InConstraintComponent): >> Severity: sh:Violation >> Source Shape: ex:ClassOrProperty >> Focus Node: hr:Employee >> Value Node: hr:Employee >> Result Path: [ sh:zeroOrMorePath rdf:type ] >> >> >> I was thinking that the zero in sh:zeroOrMorePath would see hr:Employee >> a rdfs:Class ; and validate. Is it the case that the zero in sh:zeroOrMorePath >> causes a validation engine to compare a node against itself without >> following or looking for the path? >> >> I did try using sh:oneOrMorePath, but I received the validation error >> (J) again, but (K) did not show up. Is the reason why (K) did not show up >> because it was forced to see hr:Employee a rdfs:Class ; because of the >> one in sh:oneOrMorePath and could validate it? >> >> Perhaps a validation engine validates every node along the path and not >> just where the path terminates? If this is the case, is it possible to >> validate where the path terminates only? >> >> Needless to say, I am rather confused. >> >> Can anyone clear this up? >> >> Thank you, >> James >> >> >> >> >> >
Received on Tuesday, 21 April 2020 17:40:15 UTC