PREFIX st:   <http://ns.inria.fr/sparql-template/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX dcterms: <http://purl.org/dc/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX fun: <http://w3id.org/sparql-generate/fn/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX swrl: <http://www.w3.org/2003/11/swrl#>
PREFIX prov: <http://www.w3.org/ns/prov#>
PREFIX iter: <http://w3id.org/sparql-generate/iter/>
PREFIX schema: <http://schema.org/>

BASE <https://saref.etsi.org/documentation/>

TEMPLATE <ontology/individual.rqg>( ?onto,  ?individual ) {

  """ 
  \n<div class='description'><dl>{st:incr()}
  """

  # types
  TEMPLATE {
    before = "\n<dt>{ fun:property(<en.properties>, 'belongsto') }</dt><dd>" ;
      TEMPLATE <ontology/classDescription.rqg>( ?onto,  ?class , true ) . 
    ; separator = "<br/> "
    ; after = "</dd>"
  } 
  DISTINCT WHERE {
    ?individual rdf:type ?class
    FILTER ( ?class != owl:NamedIndividual )
  } .

  # sameAs
  TEMPLATE {
    before = "\n<dt>{ fun:property(<en.properties>, 'issameas') }</dt><dd>" ;
      TEMPLATE <ontology/individualAndLiteralDescription.rqg>( ?onto,  ?individual2 ) . 
    ; separator = "<br/> "
    ; after = "</dd>"
  } 
  DISTINCT WHERE {
    { ?individual owl:sameAs ?individual2 }
    UNION 
    { ?individual2 owl:sameAs ?individual }
  } .

  # assertions
  TEMPLATE {
    "\n<dt>{ st:call-template(<ontology/propertyDescription.rqg>, ?onto,  ?p ) }</dt><dd>"
    TEMPLATE { TEMPLATE <ontology/individualAndLiteralDescription.rqg>( ?onto, ?value) . ; separator = ", "} WHERE { ?individual ?p ?value } .
    "</dd>"
    ; separator = "<br/>"
  } 
  DISTINCT WHERE {
    ?individual ?p ?value
    { ?p a owl:ObjectProperty } UNION { ?p a owl:DatatypeProperty }
  } GROUP BY ?individual ?p ORDER BY ?p .

 "\n</dl></div>"

}