Introduction to the NFDI4Culture Ontology (CTO)

The NFDI4Culture Ontology (CTO) represents the research data of the NFDI4Culture community in a centralized research data index and provides a single point of access to decentralized cultural-heritage research data. CTO supports the integration of research (meta)data into the NFDI4Culture Knowledge Graph and the NFDI4Culture Information Portal.

Accessing and Exploring CTO

WebVowl

CTO has been released on github, please find the official release file and documentation below. To browse the ontology alongside the provided documentation, it is recommended to use existing open source tools like Protegé or WebVowl.

From NFDIcore to Culture

CTO is a domain extension of the NFDIcore ontology and is aligned with the Basic Formal Ontology (BFO) 2020 to ensure semantic interoperability and ontological rigor. NFDIcore captures both the structure of the NFDI organization and the diverse datasets, services and processes provided by NFDI project partners. As a mid-level ontology, NFDIcore balances the shared goals and structures of NFDI consortia with their individual disciplinary requirements and ensures both flexibility and consistency in representing and managing research data.

NFDIcore

For more information on NFDIcore please view:

CTO Core Structure

schema:DataFeed: Represents a data feed within the Research Information Graph (RIG). This data feed is created in the Culture Information Portal using TYPO3 and its LOD extension. The metadata associated with the data feed include contact persons, export formats, licenses, and related projects and organizations.

schema:DataFeedItem: For each item in the data feed, a permanent ARK is created as its stable reference entity. The schema:DataFeedItem does not contain content-related information about the source item, aside from a license issued by NFDI4Culture and the creation and modification dates. This stable reference entity functions as a persistent identifier in the knowledge graph, remaining valid even if the content of the source item is changed or deleted.

cto: source item (cto:CTO_0001005): Connects the main content-related metadata. This includes associated media, related entities and their identifiers in external vocabularies, temporal data, and subject-area-specific metadata, such as musical incipits. Furthermore, it is possible to express which real-world entity cto: source item is about. These entities could be sculptures, buildings, persons, books, etc.

CTO Structure

Query 1: List all data feeds with data feed items and count the items.
Query
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX cto: <https://nfdi4culture.de/ontology/>

SELECT ?datafeed ?datafeedLabel (COUNT(DISTINCT ?datafeeditem) AS ?datafeeditemCount)
WHERE {
  ?datafeed rdf:type schema:DataFeed .
  ?datafeed schema:dataFeedElement ?datafeeditem .
  ?datafeed rdfs:label ?datafeedLabel .
}
GROUP BY ?datafeed ?datafeedLabel
Query 1: Result
Query
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX cto: <https://nfdi4culture.de/ontology/>

SELECT ?datafeed ?datafeedLabel (COUNT(DISTINCT ?datafeeditem) AS ?datafeeditemCount)
WHERE {
  ?datafeed rdf:type schema:DataFeed .
  ?datafeed schema:dataFeedElement ?datafeeditem .
  ?datafeed rdfs:label ?datafeedLabel .
}
GROUP BY ?datafeed ?datafeedLabel
Query 2: List all source items which are about landmarks or historical buildings.
Query
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX cto: <https://nfdi4culture.de/ontology/>

SELECT ?sourceitem ?sourceitemlabel 
WHERE {
  ?sourceitem rdf:type cto:CTO_0001005 . #cto: source item 
  ?sourceitem rdfs:label ?sourceitemlabel .
  ?sourceitem cto:CTO_0001025 ?realworldthing . #cto: is about real world entity
  ?realworldthing rdf:type schema:LandmarksOrHistoricalBuildings .
} 
Query 2: Result
Query
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX cto: <https://nfdi4culture.de/ontology/>

SELECT ?sourceitem ?sourceitemlabel 
WHERE {
  ?sourceitem rdf:type cto:CTO_0001005 . #cto: source item 
  ?sourceitem rdfs:label ?sourceitemlabel .
  ?sourceitem cto:CTO_0001025 ?realworldthing . #cto: is about real world entity
  ?realworldthing rdf:type schema:LandmarksOrHistoricalBuildings .
} 

Querying persons

Querying persons and their external identifiers

Query 3: List all persons in the KG and their external identifiers.
Query
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX cto: <https://nfdi4culture.de/ontology/>
PREFIX nfdicore: <https://nfdi.fiz-karlsruhe.de/ontology/>


SELECT DISTINCT ?person ?personLabel ?identifier
WHERE {
  ?person rdf:type nfdicore:NFDI_0000004 .
  ?person rdfs:label ?personLabel .
  ?person nfdicore:NFDI_0001006 ?identifier .
} 
Query 3: Result.
Query
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX cto: <https://nfdi4culture.de/ontology/>
PREFIX nfdicore: <https://nfdi.fiz-karlsruhe.de/ontology/>


SELECT DISTINCT ?person ?personLabel ?identifier
WHERE {
  ?person rdf:type nfdicore:NFDI_0000004 .
  ?person rdfs:label ?personLabel .
  ?person nfdicore:NFDI_0001006 ?identifier .
} 
Query 4: Count the number of persons in the graph by external identifier.
Query
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX cto: <https://nfdi4culture.de/ontology/>
PREFIX nfdicore: <https://nfdi.fiz-karlsruhe.de/ontology/>

SELECT ?identifierType ?identifierTypeLabel (COUNT(DISTINCT ?person) AS ?personCount)
WHERE {
  ?person a nfdicore:NFDI_0000004 ;           #nfdicore: person
          nfdicore:NFDI_0001006 ?identifier . #nfdicore: has external identifier 
  ?identifier a ?identifierType .
  ?identifierType rdfs:label ?identifierLabel .
}
GROUP BY ?identifierType ?identifierTypeLabel
ORDER BY DESC(?personCount)
# shmarql-view: barchart
# shmarql-x: identifierType
# shmarql-y: personCount
# shmarql-label: Instance Count

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX cto: <https://nfdi4culture.de/ontology/>
PREFIX nfdicore: <https://nfdi.fiz-karlsruhe.de/ontology/>

SELECT ?identifierType (xsd:integer(COUNT(DISTINCT ?person)) AS ?personCount)
WHERE {
  ?person a nfdicore:NFDI_0000004 ;           #nfdicore: person
          nfdicore:NFDI_0001006 ?identifier . #nfdicore: has external identifier 
  ?identifier a ?identifierType .
  ?identifierType rdfs:label ?identifierLabel .
}
GROUP BY ?identifierType 
ORDER BY DESC(?personCount)
Query 4: Result.
Query
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX cto: <https://nfdi4culture.de/ontology/>
PREFIX nfdicore: <https://nfdi.fiz-karlsruhe.de/ontology/>

SELECT ?identifierType ?identifierTypeLabel (COUNT(DISTINCT ?person) AS ?personCount)
WHERE {
  ?person a nfdicore:NFDI_0000004 ;           #nfdicore: person
          nfdicore:NFDI_0001006 ?identifier . #nfdicore: has external identifier 
  ?identifier rdf:type ?identifierType .
  ?identifierType rdfs:label ?identifierTypeLabel .
}
GROUP BY ?identifierType ?identifierTypeLabel
ORDER BY DESC(?personCount)

Querying classifiers

Querying source items and their classifiers

Query 5: Show all provider URIs with their iconclass classifiers and the datafeeds they are from.
Query
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX cto: <https://nfdi4culture.de/ontology/>
PREFIX nfdicore: <https://nfdi.fiz-karlsruhe.de/ontology/>
SELECT ?sourceitem ?datafeedLabel ?classifier
WHERE {
  ?sourceitem rdf:type cto:CTO_0001005 .  #cto: source item 
  ?sourceitem cto:CTO_0001006 ?datafeed . #cto: is referenced in 
  ?sourceitem cto:CTO_0001026 ?classifier . #cto: has external classifier
  ?classifier rdf:type cto:CTO_0001030 .    #cto: iconclass classifier
  ?datafeed rdf:type schema:DataFeed .
  ?datafeed rdfs:label ?datafeedLabel .
}
Query 5: Result.
Query
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX cto: <https://nfdi4culture.de/ontology/>
PREFIX nfdicore: <https://nfdi.fiz-karlsruhe.de/ontology/>
SELECT ?sourceitem ?datafeedLabel ?classifier
WHERE {
  ?sourceitem rdf:type cto:CTO_0001005 .  #cto: source item 
  ?sourceitem cto:CTO_0001006 ?datafeed . #cto: is referenced in 
  ?sourceitem cto:CTO_0001026 ?classifier . #cto: has external classifier
  ?classifier rdf:type cto:CTO_0001030 .    #cto: iconclass classifier
  ?datafeed rdf:type schema:DataFeed .
  ?datafeed rdfs:label ?datafeedLabel .
}

Domain Specific Modeling and Queries

Querying musical incipits

Query 6: List source items that have an incipit whose pattern starts with "A" and whose key contains "G".
Query
PREFIX schema: <http://schema.org/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX cto: <https://nfdi4culture.de/ontology/>

SELECT ?sourceitem ?sourceitemlabel ?incipit ?pattern ?key
WHERE {
  ?sourceitem rdf:type cto:CTO_0001005 . #cto: source item 
  ?sourceitem rdfs:label ?sourceitemlabel .
  ?incipit a cto:CTO_0001024 .           #cto: Incipit
  ?incipit cto:CTO_0001063 ?pattern . FILTER regex(?pattern, "^A") #has incipit pattern 
  ?incipit cto:CTO_0001064 ?key . FILTER regex(?key, "G")
  ?sourceitem cto:CTO_0001065 ?incipit . #cto: has incipit
  ?incipit rdfs:label ?incipitlabel .
} 
Query 6: Result.
Query
PREFIX schema: <http://schema.org/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX cto: <https://nfdi4culture.de/ontology/>

SELECT ?sourceitem ?sourceitemlabel ?incipit ?pattern ?key
WHERE {
  ?sourceitem rdf:type cto:CTO_0001005 . #cto: source item 
  ?sourceitem rdfs:label ?sourceitemlabel .
  ?incipit a cto:CTO_0001024 .           #cto: Incipit
  ?incipit cto:CTO_0001063 ?pattern . FILTER regex(?pattern, "^A") #has incipit pattern 
  ?incipit cto:CTO_0001064 ?key . FILTER regex(?key, "G")
  ?sourceitem cto:CTO_0001065 ?incipit . #cto: has incipit
  ?incipit rdfs:label ?incipitlabel .
} 

RISM Usecase

Query 7: Show resources from RISM Online related to the musicians Beethoven, Rossini, Liszt and Mendelssohn Bartholdy, from the same year that Ferdinand Gregorovius dealt with the musicians in his letters.
Query
PREFIX cto: <https://nfdi4culture.de/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX schema: <http://schema.org/>
PREFIX nfdicore: <https://nfdi.fiz-karlsruhe.de/ontology/>
PREFIX n4c: <https://nfdi4culture.de/id/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX gnd: <https://d-nb.info/gnd/>


SELECT DISTINCT 
?year 
?musician
?letter
?letterID
# Just show one musical example source from RISM Online
(SAMPLE(?musicalSourceLabel) AS ?musicalSource)
(SAMPLE(?pattern) AS ?musicIncipitPattern)
(SAMPLE(?rismResource) AS ?rismID)
WHERE {
  VALUES ?gnd { <https://d-nb.info/gnd/118573527> <http://d-nb.info/gnd/118573527> <https://d-nb.info/gnd/118580779> <http://d-nb.info/gnd/118580779> <http://d-nb.info/gnd/118602985> <https://d-nb.info/gnd/118602985> <https://d-nb.info/gnd/118508288> <http://d-nb.info/gnd/118508288> }
    # cto:is referenced in
    ?letterID cto:CTO_0001006 n4c:E5378.
    ?letterID rdfs:label ?letterLabel ;
    # cto:has related person/nfdicore:has external identifier         
    cto:CTO_0001009/nfdicore:NFDI_0001006 ?gnd ;
    # cto:has creation date
    cto:CTO_0001072 ?date .
    bind(year(xsd:date(?date)) as ?year) .
    # cto:is referenced in
    ?rismResource cto:CTO_0001006 n4c:E5313 .
    # cto:has related person/nfdicore:has external identifier 
    ?rismResource cto:CTO_0001009 ?person . 
    ?person nfdicore:NFDI_0001006 ?gnd .
    ?rismResource rdfs:label ?rismLabel ;
        # cto:has creation period
        cto:CTO_0001073 ?tempCover ;
        # cto:has incipit
        cto:CTO_0001065 ?incipit .
        # cto:has incipit pattern
    ?incipit cto:CTO_0001063 ?pattern .
    ?person rdfs:label ?musician .
    # Filter for a musical source of the same year from RISM Online
    FILTER(regex(str(?tempCover), str(?year)))
    # Concat label of letters/musical sources with date
    BIND(CONCAT(?letterLabel, " (", ?date, ")") AS ?letter)
    BIND(CONCAT(?rismLabel, " (", ?tempCover, ")") AS ?musicalSourceLabel)
} 

ORDER BY ?year
}