@prefix bibo: <http://purl.org/ontology/bibo/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix dcterms: <http://purl.org/dc/terms/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix po: <http://www.essepuntato.it/2008/12/pattern#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix reg: <http://purl.org/linked-data/registry#> .
@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix swrl: <http://www.w3.org/2003/11/swrl#> .
@prefix swrlb: <http://www.w3.org/2003/11/swrlb#> .
@prefix vann: <http://purl.org/vocab/vann/> .
@prefix vs: <http://www.w3.org/2003/06/sw-vocab-status/ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

dc:creator a owl:AnnotationProperty .

dc:date a owl:AnnotationProperty .

dc:description a owl:AnnotationProperty .

dc:title a owl:AnnotationProperty .

<http://purl.org/spar/po> a owl:Ontology ;
    rdfs:label "Pattern Ontology (PO)"@en ;
    dc:contributor "Sebastian Barzaghi (https://orcid.org/0000-0002-0799-1527)"^^xsd:string ;
    dc:creator "Angelo Di Iorio (https://orcid.org/0000-0002-6893-7452)"^^xsd:string,
        "Fabio Vitali (https://orcid.org/0000-0002-7562-5203)"^^xsd:string,
        "Silvio Peroni (https://orcid.org/0000-0003-0530-4305)"^^xsd:string ;
    dc:date "2026-09-21" ;
    dc:description """
The **_Pattern Ontology (PO)_** is an OWL 2 DL ontology that formally defines patterns for segmenting a document into atomic components, in order to be manipulated independently and re-flowed in different contexts.

![The main architecture of PO.](po.png)

Structural patterns allow representing document elements (such as sections, paragraphs, lists, metadata, and tables) through abstract, reusable primitives independent of specific markup syntaxes.

## Examples of use

In the following subsections, we introduce some examples to showcase how to use PO. 

The prefixes that are used in all the examples provided below are defined as follows:

        @prefix : <http://sparontologies.net/example/> .
        @prefix po: <http://www.essepuntato.it/2008/12/pattern#> .
        @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

### Structural decomposition of a document section

With PO, it is possible to represent document elements and how they manifest as patterns occurring within the document's stucture itself.

For example, the following example shows how to use PO to model a section defined as a headed container and containing a heading block as its header and a body paragraph block containing inline text and atom elements.
        
        :section-1 a po:HeadedContainer ;
                po:hasName "section" ;
                po:containsAsHeader :heading-1 ;
                po:contains :paragraph-1 .

        :heading-1 a po:Block ;
                po:hasName "h1" ;
                po:contains :text-heading .

        :paragraph-1 a po:Block ;
                po:hasName "p" ;
                po:contains :text-span .

        :text-span a po:Inline ;
                po:hasName "span" ;
                po:contains :atom-text .

        :text-heading a po:Atom ;
                po:hasName "text" .

        :atom-text a po:Atom ;
                po:hasName "text" .

## Competency Questions

PO can be used for answering several questions related to the atomic components that form a document accoridng to certain patterns.
In the following subsections, some of them are introduced together with their respective SPARQL queries. 

The prefixes that are used in all the SPARQL queries provided below are defined as follows:

        PREFIX po: <http://www.essepuntato.it/2008/12/pattern#>

### CQ1

Which header elements are contained within a headed container?
        
        SELECT ?header WHERE {
                ?section a po:headedContainer ;
                        po:containsAsHeader ?header .
        }

### CQ2

Which block elements are directly contained within a container?

        SELECT ?block WHERE {
                ?section po:contains ?block .
                ?block a po:Block .
        }

"""@en ;
    dc:title "The Pattern Ontology (PO)"@en ;
    dcterms:bibliographicCitation "Di Iorio, A., Peroni, S., Poggi, F., Vitali, F. (2012). Aﬁrst approach to the automatic recognition ofstructural patterns in XML documents. In Proceedingsof the 2012 ACM symposium on Document Engineering(DocEng 2012): 85-94. DOI: 10.1145/2361354.2361374" ;
    dcterms:created "2013-07-16" ;
    dcterms:issued "2013-07-16" ;
    dcterms:license <http://creativecommons.org/licenses/by/4.0/> ;
    dcterms:modified "2026-09-21" ;
    dcterms:publisher <https://ror.org/00wb4mk85> ;
    dcterms:source <https://github.com/SPAROntologies/po/blob/master/docs/cq.md> ;
    bibo:doi "TBA" ;
    bibo:status <http://purl.org/ontology/bibo/status/published> ;
    vann:changes """
* **v1.4.3**: 
Added new documentation, including annotation properties (e.g., `bibo:doi`, `schema:codeRepository`, etc.), term properties (e.g., `vann:example`, `vs:term_status`, etc.), exemplary competency questions with their respective SPARQL queries, and a Grafoo diagram.
        """@en ;
    vann:preferredNamespacePrefix "po"@en ;
    vann:preferredNamespaceUri "http://purl.org/spar/po"@en ;
    owl:backwardCompatibleWith po:2013-07-16 ;
    owl:priorVersion po:2013-07-16 ;
    owl:versionIRI po:2026-09-21 ;
    owl:versionInfo "1.4.3"^^xsd:string ;
    foaf:logo <https://github.com/SPAROntologies/po/blob/master/spar.png> ;
    schema:codeRepository <https://github.com/SPAROntologies/po> ;
    schema:image <https://github.com/SPAROntologies/po/blob/master/docs/current/po.png> ;
    schema:includedInDataCatalog <https://fairsharing.org/> ;
    schema:keywords "document engineering"@en,
        "documents"@en,
        "scholarly publishing"@en,
        "semantic publishing"@en .

rdfs:comment a owl:AnnotationProperty .

rdfs:label a owl:AnnotationProperty .

owl:versionInfo a owl:AnnotationProperty .

po:HeadedContainer a owl:Class ;
    rdfs:label "headed-container element"@en ;
    vann:example """
        :my-section a po:HeadedContainer ;
                po:containsAsHeader :my-title ;
                po:contains :my-para .
        """ ;
    rdfs:comment "A container element whose content model needs to begin with one or more block elements (the heading)."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf [ a owl:Class ;
            owl:intersectionOf ( po:Container [ a owl:Restriction ;
                        owl:allValuesFrom po:Block ;
                        owl:onProperty po:containsAsHeader ] ) ] ;
    vs:term_status reg:statusStable .

po:containsAsHeader a owl:ObjectProperty ;
    rdfs:label "contains as header"@en ;
    vann:example """
        :my-section 
                po:containsAsHeader :my-header-block .
        """ ;
    rdfs:comment "The relation between a structured element, containing another generic element as part of its header, and that other element."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subPropertyOf po:contains ;
    owl:inverseOf po:isContainedByAsHeader ;
    vs:term_status reg:statusStable .

po:isContainedByAsHeader a owl:ObjectProperty ;
    rdfs:label "is contained by as header"@en ;
    vann:example """
        :my-header-block 
                po:isContainedByAsHeader :my-section .
        """ ;
    rdfs:comment "The relation between an element, contained by another structured element as part of its header, and that other element."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subPropertyOf po:isContainedBy ;
    vs:term_status reg:statusStable .

owl:Thing a owl:Class .

po:Atom a owl:Class ;
    rdfs:label "atom element"@en ;
    vann:example """
        :my-atom a po:Atom ;
                po:isContainedBy :my-paragraph .
        """ ;
    rdfs:comment "Literal text that is part of the document body."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:onProperty po:isContainedBy ;
            owl:someValuesFrom [ a owl:Class ;
                    owl:unionOf ( po:Block po:Inline ) ] ] ;
    owl:disjointWith po:Field ;
    owl:equivalentClass [ a owl:Class ;
            owl:intersectionOf ( po:Flat [ a owl:Restriction ;
                        owl:allValuesFrom [ a owl:Class ;
                                owl:unionOf ( po:Block po:Inline ) ] ;
                        owl:onProperty po:isContainedBy ] ) ] ;
    vs:term_status reg:statusStable ;
    skos:note """
Similarly to `po:Inline`, elements following the 'atom' pattern can only be contained within block or inline elements (and consequently they also cannot be used as root elements of documents). 
It can contain textual content and no other elements.
    """@en .

po:Bucket a owl:Class ;
    rdfs:label "bucket element"@en ;
    vann:example """
        :my-bucket a po:Bucket ;
                po:contains :item-1, :item-2 .
        """ ;
    rdfs:comment "An element that can contain other elements but no text nodes."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf po:NonTextual,
        po:Structured ;
    owl:disjointWith po:Marker ;
    vs:term_status reg:statusStable .

po:Flat a owl:Class ;
    rdfs:label "flat element"@en ;
    vann:example """
        :my-flat a po:Flat ;
                po:hasName "text" .
        """ ;
    rdfs:comment "An element that can contain text nodes but no elements."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf po:NonStructured,
        po:Textual ;
    owl:disjointWith po:Mixed ;
    vs:term_status reg:statusStable .

po:NonStructured a owl:Class ;
    rdfs:label "non-structured element"@en ;
    vann:example """
        :my-leaf-node a po:NonStructured .
        """ ;
    rdfs:comment "An element that cannot contain other elements."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf po:Pattern ;
    owl:disjointWith po:Structured ;
    owl:equivalentClass [ a owl:Class ;
            owl:complementOf po:Structured ] ;
    vs:term_status reg:statusStable .

po:NonTextual a owl:Class ;
    rdfs:label "non-textual element"@en ;
    vann:example """
        :my-element-container a po:NonTextual .
        """ ;
    rdfs:comment "An element that cannot have textual content in its content model."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf po:Pattern ;
    owl:disjointWith po:Textual ;
    owl:equivalentClass [ a owl:Class ;
            owl:complementOf po:Textual ] ;
    vs:term_status reg:statusStable .

po:g a swrl:Variable .

po:t a swrl:Variable .

po:z a swrl:Variable .

<urn:swrl#s> a swrl:Variable .

<urn:swrl#x> a swrl:Variable .

<urn:swrl#y> a swrl:Variable .

po:Marker a owl:Class ;
    rdfs:label "marker element"@en ;
    vann:example """
        :my-break-tag a po:Marker ;
                po:hasName "br" .
        """ ;
    rdfs:comment "An element that can contain neither text nodes nor elements."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf po:NonStructured,
        po:NonTextual ;
    vs:term_status reg:statusStable .

po:Mixed a owl:Class ;
    rdfs:label "mixed element"@en ;
    vann:example """
        :my-paragraph a po:Mixed ;
                po:contains :link .
        """ ;
    rdfs:comment "An element that can contain other elements and text nodes."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf po:Structured,
        po:Textual ;
    vs:term_status reg:statusStable .

po:p a swrl:Variable .

<urn:swrl#p> a swrl:Variable .

po:Meta a owl:Class ;
    rdfs:label "meta element"@en ;
    vann:example """
        :my-doc-meta a po:Meta ;
                po:isContainedBy :my-doc-header .
        """ ;
    rdfs:comment "An element that contains neither other elements nor textual content."@en ;
    rdfs:isDefinedBy po: ;
    owl:disjointWith po:Milestone ;
    owl:equivalentClass [ a owl:Class ;
            owl:intersectionOf ( po:Marker [ a owl:Restriction ;
                        owl:onProperty po:isContainedBy ;
                        owl:someValuesFrom [ a owl:Class ;
                                owl:unionOf ( po:Container po:Popup ) ] ] ) ] ;
    vs:term_status reg:statusStable ;
    skos:note """
Contrarily to the pattern `po:Milestone`, which was meant to describe markup elements that impact the document because of their location, the main feature of its disjoint sibling is the mere existence, independently from the position it has within the document. 
`po:Meta` elements convey metadata information about the document or part of it, independently of where they are. 
Thus, meta elements can be contained only within container elements.
    """@en .

po:Record a owl:Class ;
    rdfs:label "record element"@en ;
    vann:example """
        :my-author-record a po:Record ;
                po:canContainHeteronymousElements true ;
                po:canContainHomonymousElements false .
        """ ;
    rdfs:comment "A container element that can only contain heterogeneous and non repeatable elements."@en ;
    rdfs:isDefinedBy po: ;
    owl:equivalentClass [ a owl:Class ;
            owl:intersectionOf ( po:Container [ a owl:Restriction ;
                        owl:hasValue true ;
                        owl:onProperty po:canContainHeteronymousElements ] [ a owl:Restriction ;
                        owl:hasValue false ;
                        owl:onProperty po:canContainHomonymousElements ] ) ] ;
    vs:term_status reg:statusStable .

po:canContainHeteronymousElements a owl:DatatypeProperty,
        owl:FunctionalProperty ;
    rdfs:label "can contain heteronymous elements"@en ;
    vann:example """
        :my-record 
                po:canContainHeteronymousElements true .
        """ ;
    rdfs:comment "An indication whether a hierarchical-based entity contains al least two entities having different names or not."@en ;
    rdfs:domain po:Structured ;
    rdfs:isDefinedBy po: ;
    rdfs:range xsd:boolean ;
    vs:term_status reg:statusStable .

po:canContainHomonymousElements a owl:DatatypeProperty,
        owl:FunctionalProperty ;
    rdfs:label "can contain homonymous elements"@en ;
    vann:example """
        :my-list 
                po:canContainHomonymousElements true .
        """ ;
    rdfs:comment "An indication whether a hierarchical-based entity contains al least two entities that share the same name or not."@en ;
    rdfs:domain po:Structured ;
    rdfs:isDefinedBy po: ;
    rdfs:range xsd:boolean ;
    vs:term_status reg:statusStable .

po:Field a owl:Class ;
    rdfs:label "field element"@en ;
    vann:example """
        :my-author-name a po:Field ;
                po:isContainedBy :my-author-header .
        """ ;
    rdfs:comment "Literal metadata or text that is not really part of the document body."@en ;
    rdfs:isDefinedBy po: ;
    owl:equivalentClass [ a owl:Class ;
            owl:intersectionOf ( po:Flat [ a owl:Restriction ;
                        owl:allValuesFrom [ a owl:Class ;
                                owl:unionOf ( po:Container po:Popup ) ] ;
                        owl:onProperty po:isContainedBy ] ) ] ;
    vs:term_status reg:statusStable ;
    skos:note """
Its main difference with `po:Meta` is that `po:Field` can contain textual content.
    """@en .

po:Milestone a owl:Class ;
    rdfs:label "milestone element"@en ;
    vann:example """
        :my-page-break a po:Milestone ;
                po:isContainedBy :my-paragraph .
        """ ;
    rdfs:comment """
An elements that contains neither other elements nor textual content.
"""@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:onProperty po:isContainedBy ;
            owl:someValuesFrom [ a owl:Class ;
                    owl:unionOf ( po:Block po:Inline ) ] ;
            skos:note """
Similarly to `po:Inline`, elements following the `po:Milestone` pattern can only be contained within block or inline elements (and consequently they also cannot be used as root elements of documents).

The distinctive characteristic of the pattern `po:Milestone` is the location it assumes within the document.
    """@en ] ;
    owl:equivalentClass [ a owl:Class ;
            owl:intersectionOf ( po:Marker [ a owl:Restriction ;
                        owl:allValuesFrom [ a owl:Class ;
                                owl:unionOf ( po:Block po:Inline ) ] ;
                        owl:onProperty po:isContainedBy ] ) ] ;
    vs:term_status reg:statusStable .

po:Pattern a owl:Class ;
    rdfs:label "pattern-based element"@en ;
    vann:example """
        :my-element a po:Pattern .
        """ ;
    rdfs:comment """
An atomic component of a document that is able to capture a recurrent and well knwon structure of a document.
"""@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf owl:Thing ;
    vs:term_status reg:statusStable ;
    skos:note """
Any entity belonging to this class is compliant with exactly one structural pattern.
        """@en .

po:Table a owl:Class ;
    rdfs:label "table element"@en ;
    vann:example """
        :my-list a po:Table ;
                po:canContainHeteronymousElements false ;
                po:canContainHomonymousElements true .
        """ ;
    rdfs:comment "A container element that must contain only homogeneous elements (but they can be repeated)."@en ;
    rdfs:isDefinedBy po: ;
    owl:equivalentClass [ a owl:Class ;
            owl:intersectionOf ( po:Container [ a owl:Restriction ;
                        owl:hasValue false ;
                        owl:onProperty po:canContainHeteronymousElements ] [ a owl:Restriction ;
                        owl:hasValue true ;
                        owl:onProperty po:canContainHomonymousElements ] ) ] ;
    vs:term_status reg:statusStable .

po:Textual a owl:Class ;
    rdfs:label "textual element"@en ;
    vann:example """
        :paragraph-text a po:Textual .
        """ ;
    rdfs:comment "An element that can have textual content in their content models."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf po:Pattern ;
    vs:term_status reg:statusStable .

po:Popup a owl:Class ;
    rdfs:label "popup element"@en ;
    vann:example """
        :my-footnote a po:Popup ;
                po:isContainedBy :my-paragraph ;
                po:contains :my-footnote-block .
        """ ;
    rdfs:comment "A bucket element that is only present within block and inline elements."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:onProperty po:isContainedBy ;
            owl:someValuesFrom [ a owl:Class ;
                    owl:unionOf ( po:Block po:Inline ) ] ],
        [ a owl:Restriction ;
            owl:allValuesFrom [ a owl:Class ;
                    owl:unionOf ( po:Block po:Container po:Field po:Meta ) ] ;
            owl:onProperty po:contains ] ;
    owl:equivalentClass [ a owl:Class ;
            owl:intersectionOf ( po:Bucket [ a owl:Restriction ;
                        owl:allValuesFrom [ a owl:Class ;
                                owl:unionOf ( po:Block po:Inline ) ] ;
                        owl:onProperty po:isContainedBy ] ) ] ;
    vs:term_status reg:statusStable ;
    skos:note """
Popup elements are used whenever complex structures need to be placed within content elements such as paragraphs.
    """@en .

po:Structured a owl:Class ;
    rdfs:label "structured element"@en ;
    vann:example """
        :my-section a po:Structured ;
                po:contains :my-paragraph .
        """ ;
    rdfs:comment "An element that can contain other elements."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf po:Pattern ;
    vs:term_status reg:statusStable .

po:Container a owl:Class ;
    rdfs:label "container element"@en ;
    vann:example """
        :my-body a po:Container ;
                po:contains :section-1, :section-2 .
        """ ;
    rdfs:comment "An element concerning the structural organization of a document."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:allValuesFrom [ a owl:Class ;
                    owl:unionOf ( po:Block po:Container po:Field po:Meta ) ] ;
            owl:onProperty po:contains ] ;
    owl:disjointWith po:Popup ;
    owl:equivalentClass [ a owl:Class ;
            owl:intersectionOf ( po:Bucket [ a owl:Restriction ;
                        owl:allValuesFrom [ a owl:Class ;
                                owl:unionOf ( po:Container po:Popup ) ] ;
                        owl:onProperty po:isContainedBy ] ) ] ;
    vs:term_status reg:statusStable ;
    skos:note """
Elements following this pattern contain no textual content and contain only elements compliant with the patterns: `po:Meta`, `po:Field`, `po:Block` and any subtype of `po:Container`. 

It is disjointed with the pattern `po:Popup`, although they share the same content model.
    """@en .

po:contains a owl:ObjectProperty ;
    rdfs:label "contains"@en ;
    vann:example """
        :my-container 
                po:contains :my-block .
        """ ;
    rdfs:comment "The relation between a structured element containing another generic element, and that other element."@en ;
    rdfs:domain po:Structured ;
    rdfs:isDefinedBy po: ;
    owl:inverseOf po:isContainedBy ;
    vs:term_status reg:statusStable .

po:Block a owl:Class ;
    rdfs:label "block element"@en ;
    vann:example """
        :my-paragraph a po:Block ;
                po:isContainedBy :my-section ;
                po:contains :my-span .
        """ ;
    rdfs:comment "An element that organises the document content as a sequence of nestable elements and text nodes."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:allValuesFrom [ a owl:Class ;
                    owl:unionOf ( po:Atom po:Inline po:Milestone po:Popup ) ] ;
            owl:onProperty po:contains ] ;
    owl:disjointWith po:Inline ;
    owl:equivalentClass [ a owl:Class ;
            owl:intersectionOf ( po:Mixed [ a owl:Restriction ;
                        owl:allValuesFrom [ a owl:Class ;
                                owl:unionOf ( po:Container po:Popup ) ] ;
                        owl:onProperty po:isContainedBy ] ) ] ;
    vs:term_status reg:statusStable ;
    skos:note """
In particular, elements following this pattern can contain text and other elements compliant with the patterns `po:Inline`, `po:Atom`, `po:Milestones` and `po:Popup`. 

Furthermore, it is a requirement that block elements are contained only by container and popup elements.
    """@en .

po:Inline a owl:Class ;
    rdfs:label "inline element"@en ;
    vann:example """
        :my-emphasis a po:Inline ;
                po:isContainedBy :my-paragraph ;
                po:contains :my-atom-text .
        """ ;
    rdfs:comment "An element that organises the document content as a sequence of nestable elements and text nodes, and that can contain other elements compliant with the same pattern."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:subClassOf [ a owl:Restriction ;
            owl:onProperty po:isContainedBy ;
            owl:someValuesFrom [ a owl:Class ;
                    owl:unionOf ( po:Block po:Inline ) ] ],
        [ a owl:Restriction ;
            owl:allValuesFrom [ a owl:Class ;
                    owl:unionOf ( po:Atom po:Inline po:Milestone po:Popup ) ] ;
            owl:onProperty po:contains ] ;
    owl:equivalentClass [ a owl:Class ;
            owl:intersectionOf ( po:Mixed [ a owl:Restriction ;
                        owl:allValuesFrom [ a owl:Class ;
                                owl:unionOf ( po:Block po:Inline ) ] ;
                        owl:onProperty po:isContainedBy ] ) ] ;
    vs:term_status reg:statusStable ;
    skos:note """
This class has the same use and content model of the pattern Block, but differing primarily because a) inline elements can contain other elements compliant with the same pattern while block elements cannot, and b) inline elements must always be contained by other block or inline elements and by no other type of element.

These constraints also imply that inline elements cannot be used as root elements of documents and that the class Block is disjoint with the class Inline (i.e., a markup element cannot be a block and an inline at the same time)."""@en .

po:isContainedBy a owl:ObjectProperty ;
    rdfs:label "is contained by"@en ;
    vann:example """
        :my-block 
                po:isContainedBy :my-container .
        """ ;
    rdfs:comment "An element that is contained by another structured element."@en ;
    rdfs:isDefinedBy po: ;
    vs:term_status reg:statusStable .

po:s a swrl:Variable .

po:y a swrl:Variable .

po:hasName a owl:DatatypeProperty,
        owl:FunctionalProperty ;
    rdfs:label "has name"@en ;
    vann:example """
        :my-paragraph 
                po:hasName "p" .
        """ ;
    rdfs:comment "The name of a particular element."@en ;
    rdfs:isDefinedBy po: ;
    rdfs:range xsd:string ;
    vs:term_status reg:statusStable .

po:x a swrl:Variable .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:IndividualPropertyAtom ;
                    swrl:argument1 <urn:swrl#p> ;
                    swrl:argument2 <urn:swrl#x> ;
                    swrl:propertyPredicate po:contains ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:IndividualPropertyAtom ;
                            swrl:argument1 <urn:swrl#p> ;
                            swrl:argument2 <urn:swrl#y> ;
                            swrl:propertyPredicate po:contains ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                    swrl:argument1 <urn:swrl#x> ;
                                    swrl:argument2 <urn:swrl#s> ;
                                    swrl:propertyPredicate po:hasName ] ;
                            rdf:rest [ a swrl:AtomList ;
                                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                            swrl:argument1 <urn:swrl#y> ;
                                            swrl:argument2 <urn:swrl#s> ;
                                            swrl:propertyPredicate po:hasName ] ;
                                    rdf:rest () ] ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                    swrl:argument1 <urn:swrl#p> ;
                    swrl:argument2 true ;
                    swrl:propertyPredicate po:canContainHomonymousElements ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:x ;
                    swrl:classPredicate po:Milestone ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                            swrl:argument1 po:x ;
                            swrl:argument2 po:s ;
                            swrl:propertyPredicate po:hasName ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                    swrl:argument1 po:y ;
                                    swrl:argument2 po:s ;
                                    swrl:propertyPredicate po:hasName ] ;
                            rdf:rest () ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:y ;
                    swrl:classPredicate po:Milestone ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:x ;
                    swrl:classPredicate po:Field ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                            swrl:argument1 po:x ;
                            swrl:argument2 po:s ;
                            swrl:propertyPredicate po:hasName ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                    swrl:argument1 po:y ;
                                    swrl:argument2 po:s ;
                                    swrl:propertyPredicate po:hasName ] ;
                            rdf:rest () ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:y ;
                    swrl:classPredicate po:Field ] ;
            rdf:rest () ] .

[] a owl:AllDisjointClasses ;
    owl:members ( po:HeadedContainer po:Record po:Table ) .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:x ;
                    swrl:classPredicate po:Container ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                            swrl:argument1 po:x ;
                            swrl:argument2 po:s ;
                            swrl:propertyPredicate po:hasName ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                    swrl:argument1 po:y ;
                                    swrl:argument2 po:s ;
                                    swrl:propertyPredicate po:hasName ] ;
                            rdf:rest () ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:y ;
                    swrl:classPredicate po:Container ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:x ;
                    swrl:classPredicate po:Meta ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                            swrl:argument1 po:x ;
                            swrl:argument2 po:s ;
                            swrl:propertyPredicate po:hasName ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                    swrl:argument1 po:y ;
                                    swrl:argument2 po:s ;
                                    swrl:propertyPredicate po:hasName ] ;
                            rdf:rest () ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:y ;
                    swrl:classPredicate po:Meta ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:IndividualPropertyAtom ;
                    swrl:argument1 po:p ;
                    swrl:argument2 po:x ;
                    swrl:propertyPredicate po:contains ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:IndividualPropertyAtom ;
                            swrl:argument1 po:p ;
                            swrl:argument2 po:y ;
                            swrl:propertyPredicate po:contains ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                    swrl:argument1 po:x ;
                                    swrl:argument2 po:s ;
                                    swrl:propertyPredicate po:hasName ] ;
                            rdf:rest [ a swrl:AtomList ;
                                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                            swrl:argument1 po:y ;
                                            swrl:argument2 po:t ;
                                            swrl:propertyPredicate po:hasName ] ;
                                    rdf:rest [ a swrl:AtomList ;
                                            rdf:first [ a swrl:BuiltinAtom ;
                                                    swrl:arguments ( po:s po:t ) ;
                                                    swrl:builtin swrlb:notEqual ] ;
                                            rdf:rest () ] ] ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                    swrl:argument1 po:p ;
                    swrl:argument2 true ;
                    swrl:propertyPredicate po:canContainHeteronymousElements ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:x ;
                    swrl:classPredicate po:Table ] ;
            rdf:rest () ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                    swrl:argument1 po:x ;
                    swrl:argument2 false ;
                    swrl:propertyPredicate po:canContainHeteronymousElements ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:y ;
                    swrl:classPredicate po:Pattern ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:ClassAtom ;
                            swrl:argument1 po:x ;
                            swrl:classPredicate po:Textual ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                    swrl:argument1 po:x ;
                                    swrl:argument2 po:g ;
                                    swrl:propertyPredicate po:hasName ] ;
                            rdf:rest [ a swrl:AtomList ;
                                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                            swrl:argument1 po:y ;
                                            swrl:argument2 po:g ;
                                            swrl:propertyPredicate po:hasName ] ;
                                    rdf:rest () ] ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:y ;
                    swrl:classPredicate po:Textual ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:x ;
                    swrl:classPredicate po:Record ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                            swrl:argument1 po:x ;
                            swrl:argument2 po:s ;
                            swrl:propertyPredicate po:hasName ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                    swrl:argument1 po:y ;
                                    swrl:argument2 po:s ;
                                    swrl:propertyPredicate po:hasName ] ;
                            rdf:rest () ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:y ;
                    swrl:classPredicate po:Record ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:x ;
                    swrl:classPredicate po:Record ] ;
            rdf:rest () ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                    swrl:argument1 po:x ;
                    swrl:argument2 false ;
                    swrl:propertyPredicate po:canContainHomonymousElements ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:x ;
                    swrl:classPredicate po:Inline ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                            swrl:argument1 po:x ;
                            swrl:argument2 po:s ;
                            swrl:propertyPredicate po:hasName ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                    swrl:argument1 po:y ;
                                    swrl:argument2 po:s ;
                                    swrl:propertyPredicate po:hasName ] ;
                            rdf:rest () ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:y ;
                    swrl:classPredicate po:Inline ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:x ;
                    swrl:classPredicate po:Table ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:IndividualPropertyAtom ;
                            swrl:argument1 po:x ;
                            swrl:argument2 po:y ;
                            swrl:propertyPredicate po:contains ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:IndividualPropertyAtom ;
                                    swrl:argument1 po:x ;
                                    swrl:argument2 po:z ;
                                    swrl:propertyPredicate po:contains ] ;
                            rdf:rest [ a swrl:AtomList ;
                                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                            swrl:argument1 po:z ;
                                            swrl:argument2 po:s ;
                                            swrl:propertyPredicate po:hasName ] ;
                                    rdf:rest () ] ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                    swrl:argument1 po:y ;
                    swrl:argument2 po:s ;
                    swrl:propertyPredicate po:hasName ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:x ;
                    swrl:classPredicate po:Table ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                            swrl:argument1 po:x ;
                            swrl:argument2 po:s ;
                            swrl:propertyPredicate po:hasName ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                    swrl:argument1 po:y ;
                                    swrl:argument2 po:s ;
                                    swrl:propertyPredicate po:hasName ] ;
                            rdf:rest () ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:y ;
                    swrl:classPredicate po:Table ] ;
            rdf:rest () ] .

[] a swrl:Imp ;
    swrl:body [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:x ;
                    swrl:classPredicate po:Block ] ;
            rdf:rest [ a swrl:AtomList ;
                    rdf:first [ a swrl:DatavaluedPropertyAtom ;
                            swrl:argument1 po:x ;
                            swrl:argument2 po:s ;
                            swrl:propertyPredicate po:hasName ] ;
                    rdf:rest [ a swrl:AtomList ;
                            rdf:first [ a swrl:DatavaluedPropertyAtom ;
                                    swrl:argument1 po:y ;
                                    swrl:argument2 po:s ;
                                    swrl:propertyPredicate po:hasName ] ;
                            rdf:rest () ] ] ] ;
    swrl:head [ a swrl:AtomList ;
            rdf:first [ a swrl:ClassAtom ;
                    swrl:argument1 po:y ;
                    swrl:classPredicate po:Block ] ;
            rdf:rest () ] .

