#BASE <http://base.example/#>
PREFIX ex: <http://ex.example/#>
PREFIX foaf: <http://foaf.example/#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

start = <IssueShape>

<IssueShape> {
    ex:state (ex:unassigned ex:assigned),
    ex:reportedBy @<UserShape>,
    ex:reportedOn xsd:dateTime,
    (ex:reproducedBy @<EmployeeShape>,
     ex:reproducedOn xsd:dateTime)?,
    ex:related @<IssueShape>*
}

<UserShape> {
    (foaf:name xsd:string
     | foaf:givenName xsd:string+,
       foaf:familyName xsd:string),
    foaf:mbox rdf:Resource
}

<EmployeeShape> {
    foaf:givenName xsd:string+,
    foaf:familyName xsd:string,
    foaf:phone rdf:Resource+,
    foaf:mbox rdf:Resource
}






#BASE <http://base.example/#>
PREFIX ex: <http://ex.example/#>
PREFIX foaf: <http://foaf.example/#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

<Issue1>
    ex:state        ex:unassigned ;
    ex:reportedBy   <User2> ;
    ex:reportedOn   "2013-01-23T10:18:00"^^xsd:dateTime ;
    ex:reproducedBy <Thompson.J> ;
    ex:reproducedOn "2013-01-23T11:00:00"^^xsd:dateTime ;
#    ex:related      <Issue2>, <Issue3> 
.

<User2>
    foaf:givenName "Bob" ;
    foaf:familyName "Smith" ;
    foaf:mbox <mailto:bob@example.org>
.

<Thompson.J>
    foaf:givenName "Joe", "Joseph" ;
    foaf:familyName "Thompson" ;
    foaf:phone <tel:+456> ;
    foaf:mbox <mailto:joe@example.org>
.

Primer <SPARQL validating query> <SPARQL remaining triples> <as Resource Shape>

Comparing placement of
semantic extension tests:

test on triple:

test on group:

test on shape: