- From: Holger Knublauch <holger@topquadrant.com>
- Date: Fri, 8 Apr 2016 09:35:18 +1000
- To: public-data-shapes-wg@w3.org
Peter, maybe this should be wrapped into an ISSUE so that it gets discussed properly? I am not against such a syntax. It may have its place in academic papers etc, and cover scenarios where space is scarce and Turtle snippets would be too verbose. It could potentially become a stand-alone deliverable of the WG, assuming this effort doesn't take away more critical resources. At the same time, I believe the label "User-Friendly" is not appropriate here. A user-friendly syntax should be limited to easy-to-type characters, ideally ASCII. In your email I am not even sure that the characters were correctly transmitted. Maybe call it "Symbolic" Syntax? (Or LaTeX-friendly syntax :) ) Holger On 1/04/2016 23:02, Peter F. Patel-Schneider wrote: > A User-Friendly Syntax for Core SHACL > > > This is a user-friendly syntax for the core of SHACL that tries to align > directly with my SHACL RDF syntax. > > > Example Description > > ∈ ex:Person ⊩ |≤27| # there are at most 27 people > ¹ex:child ⊩ ∋ ex:john # child subjects include John > ¹ex:child ⊩ ∈ ex:Person ∧ IRI # ... are people and not blank > ex:child² ⊩ ∈ ex:Person # child objects are people > ∈ ex:Patriot ⊩ ⋹ ex:Citizen # patriots are directly citizens > ex:password² ⊩ ^^xs:string ∧ ℓ≤24 ∧ ℓ≥8 # passwords are between 8 and 24 long > ex:age² ⊩ ^^xs:integer ∧ ≥0 # ages are non-negative integers > ex:john ⊩ ex:name ∝ "^John.*" ★ # John's name starts with "John" > ex:mstatus² ⊩ ∈ { ex:single ex:married ex:divorced } > # three marital statuses only > ex:Person ⊩ ex:mstatus ∝ |=1| # people have one marital status > ex:Person ⊩ ex:mstatus ∝ ∋ ex:married → ex:spouse ∝ |≥1| > # married people have a spouse > ex:Person ⊩ ex:mstatus ∝ ∋ ex:single → ex:spouse ∝ |≤0| > # single people don't have a spouse > ∈ ex:Person ⊩ ex:spouse ∅ ex:child ∧ # people can't marry their children > ex:child ex:age ≤ ex:age ∧ # ... are older than their children > ex:age ≤ ex:child⁻¹ ex:age ∧ # ... are younger than their parents > ex:child⁻¹ ex:child ∝ |≤9| ∧ # ... have at most 8 siblings > ex:name ∝ ∈ rdf:langString ∧ # ... names are lang-tagged strings > ex:name ∝ ➀ # ... have only one name per language > ∈ ex:Person ⊩ > ( ( ex:spouse ∝ |≤0| → ex:mstatus ∝ ( |≥1| ∧ ∈{ex:single ex:divorced} ) ) ∖ > ( ex:spouse ∝ |≤1| → ex:mstatus ∝ ( |≥1| ∧ ∈{ex:married} ) ) ∖ > |≤3| ∖ ) # people with no spouse are single or divorced > # people with one spouse are married > # and there are at most three people left over > ∈ ex:Isolated ⊩ ⟦ rdf:type ⟧ # isolated nodes have only types > ∈ ex:nonIsolated ⊩ ¬ ⟦ rdf:type ⟧ # non-isolated nodes have other values > sh:partShape ≡ (IRI ∨ sh:inverse ∝ IRI) # parts are properties or inverses > sh:pathShape ≡ ∈ sh:path ⊩ ( sh:partShape ∨ ⦇ sh:partShape ⦈ ) > # paths are parts or lists of parts > > > Grammar Meaning > > shaclDoc ::= ( prefixID | definition ) * > > prefixID ::= '@prefix' prefixName ':' IRI > > definition::= name '≡' shape # refer to shape by name > | name '≡' scopedShape # refer to shape by name > > scopedShape ::= scope ( '∪' scope )* '⊩' shape > # set of all nodes in any scope validates against shape > > scope ::= value # the value > | '∈' class # SHACL instances of class > | '¹' property # subjects of property > | property '²' # objects of property > | '¹' '?' # all subjects > | '?' '²' # all objects > > shape ::= ( filter ( '∧' filter )* '→' )? component ( '∧' component )* > # set of nodes that validate against all filters > # validates against each component > > filter ::= component # nodes that validate vs shape > > component ::= name # validate against named shape > | '¬' component # doesn't validate ag. comp. > | '∈' class ( '∪' class )* # SHACL instance of some class > | '^^' datatype ( '∪' datatype )* # has one of datatypes > | '∈' '{' value* '}' # is one of values > | '⋹' class # has rdf:type of class > | 'ℓ' '≤' nonnegativeInteger # maximum string length > | 'ℓ' '≥' nonnegativeInteger # minimum string length > | '>' literal # exclusive minimum > | '≥' literal # inclusive minimum > | '<' literal # exclusive maximum > | '≤' literal # inclusive maximum > | 'IRI' | 'Literal' | 'BlankNode' # kind of node > | regex '★' ( string )? # matches pattern (with flags) > | path '=' path # path values the same > | path '∅' path # path values disjoint > | path '<' path # path1 values < path2 values > | path '≤' path # path1 values ≤ path2 values > | path '∝' component # path values in shape > | '⦇' shape '⦈' # list members in shape > | '⟦' pathpart * '⟧' # no other property has values > | '∋' value # set contains value > | '|' '≥' nonnegativeInteger '|' # minimum size of set > | '|' '≤' nonnegativeInteger '|' # maximum size of set > | '|' '=' nonnegativeInteger '|' # exact size of set > | '➀' # only one value per language > | '(' shape ')' # validate against shape > | '(' component ('∨'component)+ ')' # validate against one or more > | '(' ( component '∖' ) + ')' # partition - see below > # The initial remnant is the entire set being validated. > # The next remnant is the subset of the current one that fails > # to validate against the filter of the respective component. > # The final remnant is empty. > # Each remnant validates against the respective component. > ⦅ > > path ::= pathpart + # composition > pathpart ::= property > | property '⁻¹' # inverse of property > > class ::= name # a class > datatype ::= name # a datatype > property ::= name # a property > value ::= name | literal # object > > regex ::= string # regular expression > > name ::= qname # NOTE: no <IRI> here, just qnames > qname ::= prefixName ':' name > IRI ::= '<' ucharacter '>' > > prefixName as per Turtle > name as per Turtle > literal as per Turtle > > string as per usual > nonnegativeInteger as per usual > > > > Possible Tweaks > > It would be possible to modify the syntax to come up with a more standard > treatment of conjunction, disjunction, and negation but that syntax would > not align as closely with the RDF syntax.
Received on Thursday, 7 April 2016 23:35:53 UTC