# A workshop morning: an unordered poster collection, three sessions in sequence,
# and the ordered programme whose slots carry them. The list adds order to what a
# bag only holds, so the first slot knows which slot comes next.

@prefix bag: <http://www.ontologydesignpatterns.org/cp/owl/bag.owl#> .
@prefix collectionentity: <http://www.ontologydesignpatterns.org/cp/owl/collectionentity.owl#> .
@prefix list: <http://www.ontologydesignpatterns.org/cp/owl/list.owl#> .
@prefix sequence: <http://www.ontologydesignpatterns.org/cp/owl/sequence.owl#> .
@prefix ex: <https://w3id.org/ontoboard/example/list#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .

ex:PosterCollection a owl:NamedIndividual , bag:Bag ;
    rdfs:label "the workshop's poster collection, in no particular order" ;
    bag:hasItem ex:PosterOnVocabularyAlignment .

ex:PosterOnVocabularyAlignment a owl:NamedIndividual , bag:Item ;
    rdfs:label "poster: Aligning Materials-Science Vocabularies" .

ex:KeynoteSession a owl:NamedIndividual , sequence:Entity ;
    rdfs:label "the keynote, 09:30" ;
    sequence:directlyFollows ex:Registration ;
    sequence:follows ex:Registration ;
    sequence:directlyPrecedes ex:CoffeeBreak ;
    sequence:precedes ex:CoffeeBreak .

ex:Registration a owl:NamedIndividual , sequence:Entity ;
    rdfs:label "registration, 09:00" .

ex:CoffeeBreak a owl:NamedIndividual , sequence:Entity ;
    rdfs:label "the coffee break, 10:30" .

ex:MorningProgramme a owl:NamedIndividual , list:List ;
    rdfs:label "the morning programme, an ordered list of two slots" ;
    list:hasLastItem ex:SlotTwo .

ex:SlotOne a owl:NamedIndividual , list:ListItem ;
    rdfs:label "slot 1, which holds the keynote" ;
    list:firstItemOf ex:MorningProgramme ;
    list:nextItem ex:SlotTwo .

ex:SlotTwo a owl:NamedIndividual , list:ListItem ;
    rdfs:label "slot 2, which holds the coffee break" .

# Only one direction of each inverse pair is asserted: firstItemOf/hasFirstItem, hasItem/itemOf, hasLastItem/lastItemOf, hasMember/isMemberOf, nextItem/previousItem. A reasoner adds the other.
