aboutsummaryrefslogtreecommitdiffstats
path: root/lv2/patch
diff options
context:
space:
mode:
Diffstat (limited to 'lv2/patch')
-rw-r--r--lv2/patch/manifest.ttl9
-rw-r--r--lv2/patch/patch.h68
-rw-r--r--lv2/patch/patch.meta.ttl374
-rw-r--r--lv2/patch/patch.ttl251
4 files changed, 702 insertions, 0 deletions
diff --git a/lv2/patch/manifest.ttl b/lv2/patch/manifest.ttl
new file mode 100644
index 0000000..25150bd
--- /dev/null
+++ b/lv2/patch/manifest.ttl
@@ -0,0 +1,9 @@
+@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+<http://lv2plug.in/ns/ext/patch>
+ a lv2:Specification ;
+ lv2:minorVersion 2 ;
+ lv2:microVersion 8 ;
+ rdfs:seeAlso <patch.ttl> .
+
diff --git a/lv2/patch/patch.h b/lv2/patch/patch.h
new file mode 100644
index 0000000..a721c5e
--- /dev/null
+++ b/lv2/patch/patch.h
@@ -0,0 +1,68 @@
+/*
+ Copyright 2012-2016 David Robillard <http://drobilla.net>
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+
+ THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+/**
+ @defgroup patch Patch
+ @ingroup lv2
+
+ Messages for accessing and manipulating properties, see
+ <http://lv2plug.in/ns/ext/patch> for details.
+
+ Note the patch extension is purely data, this header merely defines URIs for
+ convenience.
+
+ @{
+*/
+
+#ifndef LV2_PATCH_H
+#define LV2_PATCH_H
+
+#define LV2_PATCH_URI "http://lv2plug.in/ns/ext/patch" ///< http://lv2plug.in/ns/ext/patch
+#define LV2_PATCH_PREFIX LV2_PATCH_URI "#" ///< http://lv2plug.in/ns/ext/patch#
+
+#define LV2_PATCH__Ack LV2_PATCH_PREFIX "Ack" ///< http://lv2plug.in/ns/ext/patch#Ack
+#define LV2_PATCH__Delete LV2_PATCH_PREFIX "Delete" ///< http://lv2plug.in/ns/ext/patch#Delete
+#define LV2_PATCH__Copy LV2_PATCH_PREFIX "Copy" ///< http://lv2plug.in/ns/ext/patch#Copy
+#define LV2_PATCH__Error LV2_PATCH_PREFIX "Error" ///< http://lv2plug.in/ns/ext/patch#Error
+#define LV2_PATCH__Get LV2_PATCH_PREFIX "Get" ///< http://lv2plug.in/ns/ext/patch#Get
+#define LV2_PATCH__Message LV2_PATCH_PREFIX "Message" ///< http://lv2plug.in/ns/ext/patch#Message
+#define LV2_PATCH__Move LV2_PATCH_PREFIX "Move" ///< http://lv2plug.in/ns/ext/patch#Move
+#define LV2_PATCH__Patch LV2_PATCH_PREFIX "Patch" ///< http://lv2plug.in/ns/ext/patch#Patch
+#define LV2_PATCH__Post LV2_PATCH_PREFIX "Post" ///< http://lv2plug.in/ns/ext/patch#Post
+#define LV2_PATCH__Put LV2_PATCH_PREFIX "Put" ///< http://lv2plug.in/ns/ext/patch#Put
+#define LV2_PATCH__Request LV2_PATCH_PREFIX "Request" ///< http://lv2plug.in/ns/ext/patch#Request
+#define LV2_PATCH__Response LV2_PATCH_PREFIX "Response" ///< http://lv2plug.in/ns/ext/patch#Response
+#define LV2_PATCH__Set LV2_PATCH_PREFIX "Set" ///< http://lv2plug.in/ns/ext/patch#Set
+#define LV2_PATCH__accept LV2_PATCH_PREFIX "accept" ///< http://lv2plug.in/ns/ext/patch#accept
+#define LV2_PATCH__add LV2_PATCH_PREFIX "add" ///< http://lv2plug.in/ns/ext/patch#add
+#define LV2_PATCH__body LV2_PATCH_PREFIX "body" ///< http://lv2plug.in/ns/ext/patch#body
+#define LV2_PATCH__context LV2_PATCH_PREFIX "context" ///< http://lv2plug.in/ns/ext/patch#context
+#define LV2_PATCH__destination LV2_PATCH_PREFIX "destination" ///< http://lv2plug.in/ns/ext/patch#destination
+#define LV2_PATCH__property LV2_PATCH_PREFIX "property" ///< http://lv2plug.in/ns/ext/patch#property
+#define LV2_PATCH__readable LV2_PATCH_PREFIX "readable" ///< http://lv2plug.in/ns/ext/patch#readable
+#define LV2_PATCH__remove LV2_PATCH_PREFIX "remove" ///< http://lv2plug.in/ns/ext/patch#remove
+#define LV2_PATCH__request LV2_PATCH_PREFIX "request" ///< http://lv2plug.in/ns/ext/patch#request
+#define LV2_PATCH__subject LV2_PATCH_PREFIX "subject" ///< http://lv2plug.in/ns/ext/patch#subject
+#define LV2_PATCH__sequenceNumber LV2_PATCH_PREFIX "sequenceNumber" ///< http://lv2plug.in/ns/ext/patch#sequenceNumber
+#define LV2_PATCH__value LV2_PATCH_PREFIX "value" ///< http://lv2plug.in/ns/ext/patch#value
+#define LV2_PATCH__wildcard LV2_PATCH_PREFIX "wildcard" ///< http://lv2plug.in/ns/ext/patch#wildcard
+#define LV2_PATCH__writable LV2_PATCH_PREFIX "writable" ///< http://lv2plug.in/ns/ext/patch#writable
+
+#endif /* LV2_PATCH_H */
+
+/**
+ @}
+*/
diff --git a/lv2/patch/patch.meta.ttl b/lv2/patch/patch.meta.ttl
new file mode 100644
index 0000000..549757a
--- /dev/null
+++ b/lv2/patch/patch.meta.ttl
@@ -0,0 +1,374 @@
+@prefix dcs: <http://ontologi.es/doap-changeset#> .
+@prefix doap: <http://usefulinc.com/ns/doap#> .
+@prefix foaf: <http://xmlns.com/foaf/0.1/> .
+@prefix lv2: <http://lv2plug.in/ns/lv2core#> .
+@prefix patch: <http://lv2plug.in/ns/ext/patch#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+
+<http://lv2plug.in/ns/ext/patch>
+ a doap:Project ;
+ doap:created "2012-02-09" ;
+ doap:license <http://opensource.org/licenses/isc> ;
+ doap:developer <http://drobilla.net/drobilla#me> ;
+ doap:name "LV2 Patch" ;
+ doap:shortdesc "A protocol for accessing and manipulating properties." ;
+ doap:release [
+ doap:revision "2.8" ;
+ doap:created "2020-04-26" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-1.18.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Fix incorrect type of patch:sequenceNumber."
+ ]
+ ]
+ ] , [
+ doap:revision "2.6" ;
+ doap:created "2019-02-03" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-1.16.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Add patch:accept property."
+ ] , [
+ rdfs:label "Add patch:context property."
+ ]
+ ]
+ ] , [
+ doap:revision "2.4" ;
+ doap:created "2015-04-07" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-1.12.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Define patch:Get with no subject to implicitly apply to reciever. This can be used by UIs to get an initial description of a plugin."
+ ] , [
+ rdfs:label "Add patch:Copy method."
+ ]
+ ]
+ ] , [
+ doap:revision "2.2" ;
+ doap:created "2014-08-08" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-1.10.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Add patch:sequenceNumber for associating replies with requests."
+ ]
+ ]
+ ] , [
+ doap:revision "2.0" ;
+ doap:created "2013-01-10" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-1.4.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Make patch:Set a compact message for setting one property."
+ ] , [
+ rdfs:label "Add patch:readable and patch:writable for describing available properties."
+ ]
+ ]
+ ] , [
+ doap:revision "1.0" ;
+ doap:created "2012-04-17" ;
+ doap:file-release <http://lv2plug.in/spec/lv2-1.0.0.tar.bz2> ;
+ dcs:blame <http://drobilla.net/drobilla#me> ;
+ dcs:changeset [
+ dcs:item [
+ rdfs:label "Initial release."
+ ]
+ ]
+ ] ;
+ lv2:documentation """
+
+This is a vocabulary for messages that access and manipulate properties.
+It can be used as a dynamic control interface for plugins,
+or anything else with a property-based model.
+
+The key underlying concept here is to control things by manipulating arbitrary properties,
+rather than by calling application-specific methods.
+This allows implementations to understand what messages do
+(at least in a mechanical sense),
+which makes things like caching, proxying, or undo relatively straightforward to implement.
+Note, however, that this is only conceptual:
+there is no requirement to implement a general property store.
+Typically, a plugin will understand a fixed set of properties that represent its parameters or other internal state, and ignore everything else.
+
+This protocol is syntax-agnostic,
+and [homoiconic](https://en.wikipedia.org/wiki/Homoiconicity)
+in the sense that the messages use the same format as the data they manipulate.
+In particular, messages can be serialised as a binary [Object](atom.html#Object) for realtime plugin control,
+or as Turtle for saving to a file,
+sending over a network,
+printing for debugging purposes,
+and so on.
+
+This specification only defines a semantic protocol,
+there is no corresponding API.
+It can be used with the [Atom](atom.html) extension to control plugins which support message-based parameters as defined by the [Parameters](parameters.html) extension.
+
+For example, if a plugin defines a `eg:volume` parameter, it can be controlled by the host by sending a patch:Set message to the plugin instance:
+
+ :::turtle
+ [
+ a patch:Set ;
+ patch:property eg:volume ;
+ patch:value 11.0 ;
+ ]
+
+Similarly, the host could get the current value for this parameter by sending a patch:Get message:
+
+ :::turtle
+ [
+ a patch:Get ;
+ patch:property eg:volume ;
+ ]
+
+The plugin would then respond with the same patch:Set message as above.
+In this case, the plugin instance is implicitly the patch:subject,
+but a specific subject can also be given for deeper control.
+
+"""^^lv2:Markdown .
+
+patch:Copy
+ lv2:documentation """
+
+After this, the destination has the same description as the subject,
+and the subject is unchanged.
+
+It is an error if the subject does not exist,
+or if the destination already exists.
+
+Multiple subjects may be given if the destination is a container,
+but the semantics of this case are application-defined.
+
+"""^^lv2:Markdown .
+
+patch:Get
+ lv2:documentation """
+
+If a patch:property is given,
+then the receiver should respond with a patch:Set message that gives only that property.
+
+Otherwise, it should respond with a [concise bounded description](http://www.w3.org/Submission/CBD/) in a patch:Put message,
+that is, a description that recursively includes any blank node values.
+
+If a patch:subject is given, then the response should have the same subject.
+If no subject is given, then the receiver is implicitly the subject.
+
+If a patch:request node or a patch:sequenceNumber is given,
+then the response should be a patch:Response and have the same property.
+If neither is given, then the receiver can respond with a simple patch:Put message.
+For example:
+
+ :::turtle
+ []
+ a patch:Get ;
+ patch:subject eg:something .
+
+Could result in:
+
+ :::turtle
+ []
+ a patch:Put ;
+ patch:subject eg:something ;
+ patch:body [
+ eg:name "Something" ;
+ eg:ratio 1.6180339887 ;
+ ] .
+
+"""^^lv2:Markdown .
+
+patch:Insert
+ lv2:documentation """
+
+If the subject does not exist, it is created. If the subject does already
+exist, it is added to.
+
+This request only adds properties, it never removes them. The user must take
+care that multiple values are not set for properties which should only have
+one.
+
+"""^^lv2:Markdown .
+
+patch:Message
+ lv2:documentation """
+
+This is an abstract base class for all patch messages. Concrete messages are
+either a patch:Request or a patch:Response.
+
+"""^^lv2:Markdown .
+
+patch:Move
+ lv2:documentation """
+
+After this, the destination has the description that the subject had, and the
+subject no longer exists.
+
+It is an error if the subject does not exist, or if the destination already
+exists.
+
+"""^^lv2:Markdown .
+
+patch:Patch
+ lv2:documentation """
+
+This method always has at least one subject, and exactly one patch:add and
+patch:remove property. The value of patch:add and patch:remove are nodes which
+have the properties to add or remove from the subject(s), respectively. The
+special value patch:wildcard may be used as the value of a remove property to
+remove all properties with the given predicate. For example:
+
+ :::turtle
+ []
+ a patch:Patch ;
+ patch:subject &lt;something&gt; ;
+ patch:add [
+ eg:name "New name" ;
+ eg:age 42 ;
+ ] ;
+ patch:remove [
+ eg:name "Old name" ;
+ eg:age patch:wildcard ; # Remove all old eg:age properties
+ ] .
+
+"""^^lv2:Markdown .
+
+patch:Put
+ lv2:documentation """
+
+If the subject does not already exist, it is created. If the subject does
+already exist, the patch:body is considered an updated version of it, and the
+previous version is replaced.
+
+ :::turtle
+ []
+ a patch:Put ;
+ patch:subject &lt;something&gt; ;
+ patch:body [
+ eg:name "New name" ;
+ eg:age 42 ;
+ ] .
+
+"""^^lv2:Markdown .
+
+patch:Request
+ a rdfs:Class ;
+ rdfs:label "Request" ;
+ rdfs:subClassOf patch:Message ;
+ lv2:documentation """
+
+A request may have a patch:subject property, which specifies the resource that
+the request applies to. The subject may be omitted in contexts where it is
+implicit, for example if the recipient is the subject.
+
+"""^^lv2:Markdown .
+
+patch:Set
+ lv2:documentation """
+
+This is equivalent to a patch:Patch which removes _all_ pre-existing values for
+the property before setting the new value. For example:
+
+ :::turtle
+ []
+ a patch:Set ;
+ patch:subject &lt;something&gt; ;
+ patch:property eg:name ;
+ patch:value "New name" .
+
+Which is equivalent to:
+
+ :::turtle
+ []
+ a patch:Patch ;
+ patch:subject &lt;something&gt; ;
+ patch:add [
+ eg:name "New name" ;
+ ] ;
+ patch:remove [
+ eg:name patch:wildcard ;
+ ] .
+
+"""^^lv2:Markdown .
+
+patch:body
+ lv2:documentation """
+
+The details of this property's value depend on the type of message it is a part
+of.
+
+"""^^lv2:Markdown .
+
+patch:context
+ lv2:documentation """
+
+For example, a plugin may have a special context for ephemeral properties which
+are only relevant during the lifetime of the instance and should not be saved
+in state.
+
+The specific uses for contexts are application specific. However, the context
+MUST be a URI, and can be interpreted as the ID of a data model where
+properties should be stored. Implementations MAY have special support for
+contexts, for example by storing in a quad store or serializing to a format
+that supports multiple RDF graphs such as TriG.
+
+"""^^lv2:Markdown .
+
+patch:readable
+ lv2:documentation """
+
+See the similar patch:writable property for details.
+
+"""^^lv2:Markdown .
+
+patch:request
+ lv2:documentation """
+
+This can be used if referring directly to the URI or blank node ID of the
+request is possible. Otherwise, use patch:sequenceNumber.
+
+"""^^lv2:Markdown .
+
+patch:sequenceNumber
+ lv2:documentation """
+
+This property is used to associate replies with requests when it is not
+feasible to refer to request URIs with patch:request. A patch:Response with a
+given sequence number is the reply to the previously send patch:Request with
+the same sequence number.
+
+The special sequence number 0 means that no reply is desired.
+
+"""^^lv2:Markdown .
+
+patch:wildcard
+ lv2:documentation """
+
+This makes it possible to describe the removal of all values for a given
+property.
+
+"""^^lv2:Markdown .
+
+patch:writable
+ lv2:documentation """
+
+This is used to list properties that can be changed, for example to allow user
+interfaces to present appropriate controls. For example:
+
+ :::turtle
+ @prefix eg: &lt;http://example.org/&gt; .
+ @prefix rdf: &lt;http://www.w3.org/1999/02/22-rdf-syntax-ns#&gt; .
+ @prefix rdfs: &lt;http://www.w3.org/2000/01/rdf-schema#&gt; .
+ @prefix xsd: &lt;http://www.w3.org/2001/XMLSchema#&gt; .
+
+ eg:title
+ a rdf:Property ;
+ rdfs:label "title" ;
+ rdfs:range xsd:string .
+
+ eg:plugin
+ patch:writable eg:title .
+
+"""^^lv2:Markdown .
+
diff --git a/lv2/patch/patch.ttl b/lv2/patch/patch.ttl
new file mode 100644
index 0000000..7804009
--- /dev/null
+++ b/lv2/patch/patch.ttl
@@ -0,0 +1,251 @@
+@prefix foaf: <http://xmlns.com/foaf/0.1/> .
+@prefix owl: <http://www.w3.org/2002/07/owl#> .
+@prefix patch: <http://lv2plug.in/ns/ext/patch#> .
+@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
+@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
+@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
+
+<http://lv2plug.in/ns/ext/patch>
+ a owl:Ontology ;
+ rdfs:seeAlso <patch.h> ,
+ <patch.meta.ttl> ;
+ rdfs:label "LV2 Patch" ;
+ rdfs:comment "A protocol for accessing and manipulating properties." .
+
+patch:Ack
+ a rdfs:Class ;
+ rdfs:subClassOf patch:Response ;
+ rdfs:label "Ack" ;
+ rdfs:comment "An acknowledgement that a request was successful." .
+
+patch:Copy
+ a rdfs:Class ;
+ rdfs:subClassOf patch:Request ;
+ rdfs:label "Copy" ;
+ rdfs:subClassOf [
+ a owl:Restriction ;
+ owl:minCardinality 1 ;
+ owl:onProperty patch:subject
+ ] , [
+ a owl:Restriction ;
+ owl:cardinality 1 ;
+ owl:onProperty patch:destination
+ ] ;
+ rdfs:comment "A request to copy the patch:subject to the patch:destination." .
+
+patch:Delete
+ a rdfs:Class ;
+ rdfs:subClassOf patch:Request ;
+ rdfs:label "Delete" ;
+ rdfs:comment "Request that the patch:subject or subjects be deleted." .
+
+patch:Error
+ a rdfs:Class ;
+ rdfs:subClassOf patch:Response ;
+ rdfs:label "Error" ;
+ rdfs:comment "A response indicating an error processing a request." .
+
+patch:Get
+ a rdfs:Class ;
+ rdfs:subClassOf patch:Request ;
+ rdfs:label "Get" ;
+ rdfs:comment "A request for a description of the patch:subject." .
+
+patch:Insert
+ a rdfs:Class ;
+ rdfs:subClassOf patch:Request ;
+ rdfs:label "Insert" ;
+ rdfs:subClassOf [
+ a owl:Restriction ;
+ owl:cardinality 1 ;
+ owl:onProperty patch:subject
+ ] ;
+ rdfs:comment "A request to insert a patch:body into the patch:subject." .
+
+patch:Message
+ a rdfs:Class ;
+ rdfs:label "Patch Message" ;
+ rdfs:comment "A patch message." .
+
+patch:Move
+ a rdfs:Class ;
+ rdfs:subClassOf patch:Request ;
+ rdfs:label "Move" ;
+ rdfs:subClassOf [
+ a owl:Restriction ;
+ owl:cardinality 1 ;
+ owl:onProperty patch:subject
+ ] , [
+ a owl:Restriction ;
+ owl:cardinality 1 ;
+ owl:onProperty patch:destination
+ ] ;
+ rdfs:comment "A request to move the patch:subject to the patch:destination." .
+
+patch:Patch
+ a rdfs:Class ;
+ rdfs:subClassOf patch:Request ,
+ [
+ a owl:Restriction ;
+ owl:minCardinality 1 ;
+ owl:onProperty patch:subject
+ ] , [
+ a owl:Restriction ;
+ owl:cardinality 1 ;
+ owl:onProperty patch:add
+ ] , [
+ a owl:Restriction ;
+ owl:cardinality 1 ;
+ owl:onProperty patch:remove
+ ] ;
+ rdfs:label "Patch" ;
+ rdfs:comment "A request to add and/or remove properties of the patch:subject." .
+
+patch:Put
+ a rdfs:Class ;
+ rdfs:subClassOf patch:Request ;
+ rdfs:label "Put" ;
+ rdfs:subClassOf [
+ a owl:Restriction ;
+ owl:cardinality 1 ;
+ owl:onProperty patch:subject
+ ] ;
+ rdfs:comment "A request to put the patch:body as the patch:subject." .
+
+patch:Request
+ a rdfs:Class ;
+ rdfs:label "Request" ;
+ rdfs:subClassOf patch:Message ;
+ rdfs:comment "A patch request message." .
+
+patch:Response
+ a rdfs:Class ;
+ rdfs:subClassOf patch:Message ;
+ rdfs:label "Response" ;
+ rdfs:comment "A response to a patch:Request." .
+
+patch:Set
+ a rdfs:Class ;
+ rdfs:label "Set" ;
+ rdfs:subClassOf patch:Request ,
+ [
+ a owl:Restriction ;
+ owl:cardinality 1 ;
+ owl:onProperty patch:property
+ ] , [
+ a owl:Restriction ;
+ owl:cardinality 1 ;
+ owl:onProperty patch:value
+ ] ;
+ rdfs:comment "A compact request to set a property to a value." .
+
+patch:accept
+ a rdf:Property ,
+ owl:ObjectProperty ;
+ rdfs:label "accept" ;
+ rdfs:domain patch:Request ;
+ rdfs:range rdfs:Class ;
+ rdfs:comment "An accepted type for a response." .
+
+patch:add
+ a rdf:Property ,
+ owl:ObjectProperty ,
+ owl:FunctionalProperty ;
+ rdfs:domain patch:Patch ;
+ rdfs:range rdfs:Resource ;
+ rdfs:label "add" ;
+ rdfs:comment "The properties to add to the subject." .
+
+patch:body
+ a rdf:Property ,
+ owl:ObjectProperty ,
+ owl:FunctionalProperty ;
+ rdfs:domain patch:Message ;
+ rdfs:label "body" ;
+ rdfs:comment "The body of a message." .
+
+patch:context
+ a rdf:Property ,
+ owl:ObjectProperty ;
+ rdfs:domain patch:Message ;
+ rdfs:label "context" ;
+ rdfs:comment "The context of properties in this message." .
+
+patch:destination
+ a rdf:Property ,
+ owl:ObjectProperty ,
+ owl:FunctionalProperty ;
+ rdfs:domain patch:Message ;
+ rdfs:label "destination" ;
+ rdfs:comment "The destination to move the patch:subject to." .
+
+patch:property
+ a rdf:Property ,
+ owl:ObjectProperty ;
+ rdfs:label "property" ;
+ rdfs:domain patch:Message ;
+ rdfs:range rdf:Property ;
+ rdfs:comment "The property for a patch:Set or patch:Get message." .
+
+patch:readable
+ a rdf:Property ,
+ owl:ObjectProperty ;
+ rdfs:label "readable" ;
+ rdfs:range rdf:Property ;
+ rdfs:comment "A property that can be read with a patch:Get message." .
+
+patch:remove
+ a rdf:Property ,
+ owl:ObjectProperty ,
+ owl:FunctionalProperty ;
+ rdfs:label "remove" ;
+ rdfs:domain patch:Patch ;
+ rdfs:range rdfs:Resource ;
+ rdfs:comment "The properties to remove from the subject." .
+
+patch:request
+ a rdf:Property ,
+ owl:ObjectProperty ,
+ owl:FunctionalProperty ;
+ rdfs:label "request" ;
+ rdfs:domain patch:Response ;
+ rdfs:range patch:Request ;
+ rdfs:comment "The request this is a response to." .
+
+patch:sequenceNumber
+ a rdf:Property ,
+ owl:DatatypeProperty ,
+ owl:FunctionalProperty ;
+ rdfs:label "sequence number" ;
+ rdfs:domain patch:Message ;
+ rdfs:range xsd:int ;
+ rdfs:comment "The sequence number of a request or response." .
+
+patch:subject
+ a rdf:Property ,
+ owl:ObjectProperty ,
+ owl:FunctionalProperty ;
+ rdfs:domain patch:Message ;
+ rdfs:label "subject" ;
+ rdfs:comment "The subject this message applies to." .
+
+patch:value
+ a rdf:Property ,
+ owl:DatatypeProperty ;
+ rdfs:label "value" ;
+ rdfs:domain patch:Set ;
+ rdfs:range rdf:Property ;
+ rdfs:comment "The value of a property in a patch:Set message." .
+
+patch:wildcard
+ a rdfs:Resource ;
+ rdfs:label "wildcard" ;
+ rdfs:comment "A wildcard that matches any resource." .
+
+patch:writable
+ a rdf:Property ,
+ owl:ObjectProperty ;
+ rdfs:label "writable" ;
+ rdfs:range rdf:Property ;
+ rdfs:comment "A property that can be set with a patch:Set or patch:Patch message." .
+