@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@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 owl: <http://www.w3.org/2002/07/owl#> .

@prefix sw:     <http://www.w3.org/2003/06/sw-vocab-status/ns#> .
@prefix skos:   <http://www.w3.org/2004/02/skos/core#> .
@prefix vann:   <http://purl.org/vocab/vann/> .
@prefix voaf:   <http://purl.org/vocommons/voaf#> .
@prefix dce:    <http://purl.org/dc/elements/1.1/> .
@prefix dct:    <http://purl.org/dc/terms/> .
@prefix widoco:	<https://w3id.org/widoco/vocab#>.
@prefix vaem:   <http://www.linkedmodel.org/schema/vaem#>.

@base        <https://w3id.org/fm/edit/ontology#> .
@prefix :    <https://w3id.org/fm/edit/ontology#> .
@prefix obs: <https://w3id.org/fm/observable/ontology#> .
@prefix edit: <https://w3id.org/fm/edit/ontology#> .

#################################################################
# the edit ontology
#################################################################

<https://w3id.org/fm/edit/ontology> 
    rdf:type owl:Ontology ;
    vann:preferredNamespaceUri    "https://w3id.org/fm/edit/ontology#" ;
    vann:preferredNamespacePrefix "edit" ;
    owl:versionIRI <https://w3id.org/fm/edit/ontology/0.0.0>;
    owl:versionInfo "0.0.0" ;
    rdfs:label "The edit ontology"@en ;
    rdfs:comment "An ontology of define a concrete syntax for some domain ontology";
    dct:created  "2026-04-10"^^xsd:date ;
    dct:modified "2026-04-10"^^xsd:date ;
    dct:issued   "2026-04-10"^^xsd:date ;
    dce:title "The edit ontology"@en ;
    dct:subject "meta"@en;
    dct:subject "upper"@en;

    dce:abstract '''
The edit ontology allows to describe a concrete syntax for a domain ontology, or abstract syntax. The representation of the domain is basically a tree with object nodes and data nodes. Object nodes are associated to domain instances and may have children. Data nodes are associated to instance properties.
'''@en;

    widoco:introduction '''
An abstract syntax describes the concepts independently on how these concepts are represented, in contrast with a concrete syntax, that describes how to represent these concepts.

The data structure of an application can be described by an abstract syntax, while its user interface is a realization of a concrete syntax of this abstract syntax.

The edit ontology allows to describe a concrete syntax for a domain ontology, or abstract syntax. The representation of the domain is basically a tree with object nodes and data nodes. Object nodes are associated to domain instances and may have children. Data nodes are associated to instance properties.

The edit ontology fulfills exactly the same purpose as the genmodel in the EMF. It is a vocabulary for describing a tree-based representation of domain data. This syntax can be used in a UI composed of a master-detail view: the master view is the complete tree, while the detail view gives information about the node selected in the master view, like for instance the properties of the instance associated to the node, with their values.

The edit ontology could be used by a generic user interface, providing an application for any domain specific ontology, if an edit model is povided for that domain ontology.
'''@en;

    dce:description '''
The edit ontology is a syntax for describing a tree representation of domain data.

We make a distinction between the definition part (a vocabulary for the concrete syntax) and the defined part (an instantiation of that concrete syntax). Besides, the definition part relies on a concept of providers, that receives its own section.

![Class Diagram](./resources/ClassDiagramEdit.svg)


### The definition model

The definition models *defines* a concrete syntax for the targeted domain ontology.

- **RootDefinition**: defines the root(s) of the tree
- **NodeObjectDefinition**: defines a NodeObject, so a node of the tree 
  - associated to instances (one or many)
  - with a (defined) role
  - with respect to the parent node
- **NodeDataDefinition**: defines a NodeData, so a node of the tree 
  - associated to values (one or many)
  - with a (defined) role
  - with respect to the parent node

```mermaid
classDiagram
    class NodeDefinition  {
        role: string
        isEdit: boolean
        multiplicity: 1, many
        colorProvider: ColorProvider
        imageProvider: ImageProvider
    }

    NodeDefinition <|-- NodeDefinitionObject

    class NodeDefinitionObject  {
        labelProvider: LabelProvider
        ownership: #123; crossReference, owning, root #125;
    }
    NodeDefinitionObject o--> NodeDefinition: child

    NodeDefinitionObject <|-- RootDefinition 
    class RootDefinition  {
        ownership: root
    }
    RootDefinition --> ObjectProvider: rootObjectProvider

    NodeDefinitionObject <|-- NodeDefinitionObjectOwned
    class NodeDefinitionObjectOwned  {
        ownership: owning
        nodeType: #123; named, blank, synthetic #125;
    }
    NodeDefinitionObjectOwned --> ObjectProvider: subjectObjectProvider

    NodeDefinitionObject <|-- NodeDefinitionObjectCrossReference
    class NodeDefinitionObjectCrossReference  {
        ownership: crossReference
    }
    NodeDefinitionObjectCrossReference --> ObjectProvider: objectRange
    NodeDefinitionObjectCrossReference --> ObjectProvider: subjectObjectProvider


    NodeDefinition <|-- NodeDefinitionData
    class NodeDefinitionData {
        valueFormat: Format
    }

    class ObjectProvider :::other

    class DataProvider ::: other 
    NodeDefinitionData --> DataProvider: dataProvider
    NodeDefinitionData --> DataProvider: dataRange

    classDef default fill:#e9edc9,color:black
    classDef other   fill:white,color:black
```

### The node model

The node model is a (the) model of the concrete syntax. It models what is rendered: object/data nodes with values, labels, color, images.

- **Node**: an node in the Tree 
  - with a role with respect to the parent node
  - associated with values (zero, one or many)
- **NodeValue**: a value for a Node in the Tree 
  - associated with the (one) actual value
- **NodeObject**: an object node in the Tree 
  - with a role with respect to the parent node
  - associated with (object) values (zero, one or many)
- **NodeValueObject**: a value for an NodeObject
  - associated with one object
  - possibly with children (data or object)
- **NodeData**: a data node in the Tree 
  - with a role with respect to the parent node
  - associated with (literal) values (zero, one or many)
- **NodeValueData**: a value for an NodeObject
  - associated with one literal

The abstract model:
```mermaid
classDiagram
    class NodeDefinition :::defin {
        role: string
        isEdit: boolean
        multiplicity: 1, many
    }

    NodeDefinition <-- Node : definition

    class Node {
        multiplicity: 1, many
    }

    Node --> NodeValue: value

    NodeValue <|-- NodeValueObject
    class NodeValue {
        object: Domain
        color: Color
        image: Image
    }

   
    NodeValueObject o--> Node: child

    classDef default fill:#f96,color:black
    classDef defin    fill:#e9edc9,color:black
    classDef other   fill:white,color:black
```


The concrete model:
```mermaid
classDiagram
    class NodeDefinitionData :::defin {
        role: string
        isEdit: boolean
        multiplicity: 1, many
        dataProvider: DataProvider
        valueFormat: string
        imageProvider: ImageProvider
        colorProviderf: ColorProvider
    }

    class NodeDefinitionObject :::defin {
        role: string
        isEdit: boolean
        multiplicity: 1, many
        labelProvider: LabelProvider
        ownership: #123; owned, crossReference, root #125;
        nodeType: #123; named, blank, synthetic #125;
        subjectObjectProvider: ObjectProvider
        rootObjectProvider: ObjectProvider
        imageProvider: ImageProvider
        colorProviderf: ColorProvider
    }

    NodeValueObject o--> NodeData: childData
    NodeValueObject o--> NodeObject: childObject

    NodeDefinitionData <-- NodeData : definition
    NodeDefinitionObject <-- NodeObject : definition

    NodeData --> NodeValueData: dataValue
    NodeObject --> NodeValueObject: objectValue

    class NodeValueObject {
        object: Domain
        color: Color
        image: Image
        label: string
    }
    class NodeValueData {
        value: Literal
        color: Color
        image: Image
        formattedValue: string
    }

    classDef default fill:#f96,color:black
    classDef defin    fill:#e9edc9,color:black
    classDef other   fill:white,color:black
```

### The Provider model

Providers allow to retrieve an object or a literal or a string or a color or an image from the domain data for the nodes in the tree.

There are 3 types of providers:
- **DomainPredicate**: a predicate with as domain some Domain class; the values provided are the values associated by the predicate to the parent node domain instance.
- **NodePredicate**: a predicate with as domain some Node (sub)class; the values provided are the values associated by the predicate to the parent node domain instance.
- **Domain**: a Class of (in) the Domain; thes value provided is the instances of that class.

#### Providers

```mermaid
classDiagram
    class Class :::other {
    }
    class Domain :::defin {
    }
    class Property :::other {
    }
    class DomainPredicate :::defin {
    }
    class NodePredicate :::defin {
        domain : #123; Node #125;
    }

    Class <|-- Domain
    Property --> Class: domain
    DomainPredicate --> Domain: domain
    
    Property <|--DomainPredicate
    Property <|--NodePredicate

    classDef default fill:#f96,color:black
    classDef defin   fill:#e9edc9,color:black
    classDef other   fill:white,color:black
```

#### Object providers

```mermaid
classDiagram
    class ObjectProvider  {
    }
    class DomainObjectProvider  {
    }
    ObjectProvider <|-- Domain
    ObjectProvider <|-- DomainObjectProvider
    ObjectProvider <|-- NodeObjectProvider
    DomainPredicate <|-- DomainObjectProvider
    NodePredicate <|-- NodeObjectProvider

    class Domain :::defin {
    }
    class DomainPredicate :::defin {
    }
    class NodePredicate :::defin {
    }

    classDef default fill:#f96,color:black
    classDef defin    fill:#e9edc9,color:black
    classDef other   fill:white,color:black
```


#### Data provider model

```mermaid
classDiagram
    class DataProvider  {
    }
    class DomainDataProvider  {
    }
    DataProvider <|-- Datatype
    DataProvider <|-- DomainDataProvider
    DataProvider <|-- NodeDataProvider
    DomainPredicate <|-- DomainDataProvider
    NodePredicate <|-- NodeDataProvider

    class Datatype :::other {
    }
    class DomainPredicate :::defin {
    }
    class NodePredicate :::defin {
    }

    classDef default fill:#f96,color:black
    classDef defin    fill:#e9edc9,color:black
    classDef other   fill:white,color:black
```


#### String (label) provider model
```mermaid
classDiagram
    class StringProvider  {
    }
    class DomainStringProvider  {
    }
    StringProvider <|-- String
    StringProvider <|-- DomainStringProvider
    StringProvider <|-- NodeStringProvider
    DomainPredicate <|-- DomainStringProvider
    NodePredicate <|-- NodeStringProvider

    class String :::other {
    }
    class DomainPredicate :::defin {
    }
    class NodePredicate :::defin {
    }

    classDef default fill:#f96,color:black
    classDef defin    fill:#e9edc9,color:black
    classDef other   fill:white,color:black
```

#### Image provider model
```mermaid
classDiagram
    class ImageProvider  {
    }
    class DomainImageProvider  {
    }
    ImageProvider <|-- Image
    ImageProvider <|-- DomainImageProvider
    ImageProvider <|-- NodeImageProvider
    DomainPredicate <|-- DomainImageProvider
    NodePredicate <|-- NodeImageProvider

    class Image :::other {
    }
    class DomainPredicate :::defin {
    }
    class NodePredicate :::defin {
    }

    classDef default fill:#f96,color:black
    classDef defin    fill:#e9edc9,color:black
    classDef other   fill:white,color:black
```

#### Color provider model
```mermaid
classDiagram
    class ColorProvider  {
    }
    class DomainColorProvider  {
    }
    class NodeColorProvider  {
    }
    ColorProvider <|-- Color
    ColorProvider <|-- DomainColorProvider
    ColorProvider <|-- NodeColorProvider
    DomainPredicate <|-- DomainColorProvider
    NodePredicate <|-- NodeColorProvider

    class Color :::other {
    }
    class DomainPredicate :::defin {
    }
    class NodePredicate :::defin {
    }

    classDef default fill:#f96,color:black
    classDef defin    fill:#e9edc9,color:black
    classDef other   fill:white,color:black
```
'''@en.  
    

#################################################################
# the edit Domain: a set of classes
#################################################################

# TODO is this concept of domain useful?
#    we could relax the provider rules and consider any predicate

# TODO externalize the domain definition
# all the owl:Class's are in the edit domain
owl:Class rdfs:subClassOf edit:Domain. 

# all Observable are in the edit domain (more restricted than above)
#obs:Observable rdfs:subClassOf edit:Domain.

###############################################################################
# Enumeration
###############################################################################
edit:Multiplicity owl:oneOf(
    edit:multiplicityOne 
    edit:multiplicityMany
).

edit:Ownership owl:oneOf(
    edit:ownershipOwning 
    edit:ownershipCrossReference
    edit:ownershipRoot
).

edit:NodeType owl:oneOf (
    edit:nodeTypeNamed
    edit:nodeTypeBlank
    edit:nodeTypeSynthetic
).

###############################################################################
# Node Definition
###############################################################################
edit:NodeDefinition 
    rdf:type rdfs:Class;
    rdfs:comment '''A node definition in the edit model'''@en.

edit:multiplicity
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinition;
    rdfs:range edit:Multiplicity;
    rdfs:comment '''The multiplicity of instances this Node is expected to have'''@en.    

edit:isEdit
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinition;
    rdfs:range xsd:boolean;
    rdfs:comment '''Whether this Node supports modification (addition, removal)'''@en.

edit:role
    rdfs:domain edit:NodeDefinition;
    rdfs:range xsd:string;
    rdfs:comment '''The role of the object or of the value at hand (with respect to its parent (=subject))'''@en.

edit:imageProvider
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinition;
    rdfs:range edit:ImageProvider;
    rdfs:comment '''The image provider associated to a node definition'''@en.

edit:colorProvider
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinition;
    rdfs:range edit:ColorProvider;
    rdfs:comment '''The color provider associated to a node definition'''@en.

###############################################################################
# Object Node Definition
###############################################################################
edit:NodeDefinitionObject 
    rdf:type rdfs:Class;
    rdfs:subClassOf edit:NodeDefinition;
    rdfs:comment '''
An object node in the edit model, defining a Domain instance representation.
The node definition supports 3 different ownerships: root or owning reference and cross reference
 (not mutually exclusive)
'''@en.

edit:labelProvider 
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinitionObject;
    rdfs:range edit:StringProvider;
    rdfs:comment '''The property of the instance to be used as label for the Node, might be rdfs:label'''@en.

edit:ownership
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinitionObject;
    rdfs:range edit:Ownership;
    rdfs:comment '''The ownership of the node (root or owning or cross reference)'''@en.    

edit:childDefinition
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinitionObject;
    rdfs:range edit:NodeDefinition;
    rdfs:comment '''Child node for this node'''.

edit:childDefinitionObject
    rdf:type rdf:Property;
    rdfs:subPropertyOf edit:childDefinition;
    rdfs:domain edit:NodeDefinitionObject;
    rdfs:range edit:NodeDefinitionObject;
    rdfs:comment '''Object child node for this node'''.

edit:childDefinitionData
    rdf:type rdf:Property;
    rdfs:subPropertyOf edit:childDefinition;
    rdfs:domain edit:NodeDefinitionObject;
    rdfs:range edit:NodeDefinitionData;
    rdfs:comment '''Data child node for this node'''.

edit:subjectObjectProvider 
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinitionObject;
    rdfs:range edit:ObjectProvider;
    rdfs:comment '''Provides the instance represented by node defined by this node definition, when it is a child (= has a subject parent)'''@en.

# root Definition
edit:RootDefinition
    rdf:type rdfs:Class;
    rdfs:subClassOf edit:NodeDefinitionObject;
    rdf:type owl:Restriction ;
    owl:onProperty edit:ownership;
    owl:hasValue edit:ownershipRoot;
    rdfs:comment '''A Definition for a Root of the document'''@en.

edit:rootObjectProvider 
    rdf:type rdf:Property;
    rdfs:domain edit:RootDefinition;
    rdfs:range edit:ObjectProvider;
    rdfs:comment '''Provides the instance represented by node defined by this node definition, when it is a root'''@en.

# object owned (node owning)
edit:NodeDefinitionObjectOwned
    rdf:type rdfs:Class;
    rdfs:subClassOf edit:NodeDefinitionObject;
    rdf:type owl:Restriction ;
    owl:onProperty edit:ownership;
    owl:hasValue edit:ownershipOwning;
    rdfs:comment '''A Node definition object owning its children'''@en.

edit:nodeType    
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinitionObjectOwned;
    rdfs:range edit:NodeType;
    rdfs:comment '''The node type of the nodes represented by this definition'''@en.

# object cross reference
edit:NodeDefinitionObjectCrossReference
    rdf:type rdfs:Class;
    rdfs:subClassOf edit:NodeDefinitionObject;
    rdf:type owl:Restriction ;
    owl:onProperty edit:ownership;
    owl:hasValue edit:ownershipCrossReference;
    rdfs:comment '''A Node definition object referring to non-owned objects'''@en.

edit:objectRange 
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinitionObjectCrossReference;
    rdfs:range edit:ObjectProvider;
    rdfs:comment '''The range of new elements (references) this node can accept'''@en.

###############################################################################
# Data Node Definition
###############################################################################
edit:NodeDefinitionData 
    rdf:type rdfs:Class;
    rdfs:subClassOf edit:NodeDefinition;
    rdfs:comment '''A Data Property to be shown for the Node'''.

edit:dataProvider
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinitionData;
    rdfs:range edit:DataProvider;
    rdfs:comment '''The data provider for this node'''@en.

edit:dataRange
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinitionData;
    rdfs:range edit:DataProvider;
    rdfs:comment '''The property providing the range of values for the property'''@en.

edit:valueFormat
    rdf:type rdf:Property;
    rdfs:domain edit:NodeDefinitionData;
    rdfs:comment '''
The format to use to convert this node value to a string, as defined for std:sprintf. 
See reference https://en.cppreference.com/w/cpp/io/c/printf.html.
'''@en.

###############################################################################
# Node instances
###############################################################################

# abstract node
edit:definition 
    rdf:type rdf:Property;
    rdfs:domain edit:Node;
    rdfs:range edit:NodeDefinition.

edit:Node rdf:type rdfs:Class;
    rdfs:comment '''A node in the run-time tree'''@en.

edit:nodeValue
    rdf:type rdf:Property;
    rdfs:domain edit:Node;
    rdfs:range edit:NodeValue.

edit:NodeValue
    rdf:type rdfs:Class.

edit:image
    rdf:type rdf:Property;
    rdfs:domain edit:NodeValue;
    rdfs:range edit:Image;
    rdfs:comment '''The image associated to a node'''@en.

edit:color
    rdf:type rdf:Property;
    rdfs:domain edit:NodeValue;
    rdfs:range edit:Color;
    rdfs:comment '''The color associated to a node'''@en.

# data node
edit:definitionData
    rdf:type rdf:Property;
    rdfs:subPropertyOf edit:definition;
    rdfs:domain edit:NodeData;
    rdfs:range edit:NodeDefinitionData.

edit:NodeData rdf:type rdfs:Class;
    rdfs:subClassOf edit:Node;
    rdfs:comment '''A data node in the run-time tree'''@en.

edit:nodeValueData
    rdf:type rdf:Property;
    rdfs:subPropertyOf edit:nodeValue;
    rdfs:domain edit:NodeData;
    rdfs:range edit:NodeValueData.

edit:NodeValueData 
    rdf:type rdfs:Class;
    rdfs:subClassOf edit:NodeValue;
    rdfs:comment '''A data value in the tree'''@en.

edit:value 
    rdf:type rdf:Property;
    rdfs:domain edit:NodeValueData;
    rdfs:range rdfs:Literal;
    rdfs:comment '''The actual value associated with the node'''@en.

edit:valueFormatted
    rdf:type rdf:Property;
    rdfs:domain edit:NodeValueData;
    rdfs:range xsd:string;
    rdfs:comment '''The value associated to the node, formatted'''@en.

# object node
edit:definitionObject
    rdf:type rdf:Property;
    rdfs:subPropertyOf edit:definition;
    rdfs:domain edit:NodeObject;
    rdfs:range edit:NodeDefinitionObject.

edit:NodeObject 
    rdf:type rdfs:Class;
    rdfs:subClassOf edit:Node;
    rdfs:comment '''A node in the run-time tree'''@en.

edit:nodeValueObject
    rdf:type rdf:Property;
    rdfs:subPropertyOf edit:nodeValue;
    rdfs:domain edit:NodeObject;
    rdfs:range edit:NodeValueObject.

edit:NodeValueObject 
    rdf:type rdfs:Class;
    rdfs:subClassOf edit:NodeValue;
    rdfs:comment '''An object node in the tree'''@en.

edit:object 
    rdf:type owl:ObjectProperty;
    rdfs:domain edit:NodeValueObject;
    rdfs:comment '''The domain object associated with the node'''@en.

edit:label
    rdf:type rdf:Property;
    rdfs:domain edit:NodeValueObject;
    rdfs:range xsd:string;
    rdfs:comment '''The label associated with the instance of the node'''@en.

edit:child 
    rdf:type rdf:Property;
    rdfs:domain edit:NodeValueObject;
    rdfs:range edit:Node;
    rdfs:comment '''Child node for this node'''.

edit:childData 
    rdf:type rdf:Property;
    rdfs:subPropertyOf edit:child;
    rdfs:domain edit:NodeValueObject;
    rdfs:range edit:NodeData;
    rdfs:comment '''Data child node for this node'''.

edit:childObject rdf:type rdf:Property;
    rdfs:subPropertyOf edit:child;
    rdfs:domain edit:NodeValueObject;
    rdfs:range edit:NodeObject;
    rdfs:comment '''Object child node for this node'''.

###############################################################################
# predicate axioms
###############################################################################

edit:DomainPredicate 
    rdfs:subClassOf rdf:Property;
    rdf:type owl:Restriction ;
    owl:onProperty rdfs:domain;
    owl:someValuesFrom edit:Domain;
    rdfs:comment '''A predicate providing Objects (whose domain is an Observable)'''@en.

edit:NodePredicate
    rdfs:subClassOf rdf:Property;
    rdf:type owl:Restriction ;
    owl:onProperty rdfs:domain;
    owl:hasValue edit:Node;
    rdfs:comment '''
A predicate in the domain of Node 
(Node instances are subject of this predicate)
'''@en.

###############################################################################
# Provider axioms
###############################################################################

# ObjectProvider ##############################################################
edit:ObjectProvider 
    owl:disjointUnionOf (
        edit:Dommain
        edit:DomainObjectProvider
        edit:NodeObjectProvider
    ).

edit:DomainObjectProvider
    owl:intersectonOf (
        rdfs:subClassOf owl:ObjectProperty
        rdfs:subClassOf edit:DomainPredicate
    );
    rdfs:comment '''A Domain predicate providing Objects'''@en.

edit:NodeObjectProvider
    owl:intersectonOf (
        rdfs:subClassOf owl:ObjectProperty
        rdfs:subClassOf edit:NodePredicate
    );
    rdfs:comment '''A Node predicate providing Objects'''@en.

# DataProvider ################################################################
edit:DataProvider
    owl:disjointUnionOf (
        rdfs:Datatype
        edit:DomainDataProvider
        edit:NodeDataProvider
    ).

edit:DomainDataProvider
    owl:intersectionOf (
        rdfs:subClassOf owl:DatatypeProperty
        rdfs:subClassOf edit:DomainPredicate
    ).

edit:NodeDataProvider
    owl:intersectionOf (
        rdfs:subClassOf owl:DatatypeProperty
        rdfs:subClassOf edit:NodePredicate
    ).


# Serialization annotations added by generate_docs.py
<https://w3id.org/fm/edit/ontology>
    <https://w3id.org/widoco/vocab#turtleSerialization> "edit.ttl" ;
    <https://w3id.org/widoco/vocab#rdfxmlSerialization> "edit.rdf" ;
    <https://w3id.org/widoco/vocab#ntSerialization> "edit.nt" ;
    <https://w3id.org/widoco/vocab#jsonldSerialization> "edit.jsonld" .
