# Objects and strings ###### tags: `openwemi` Legend: ```mermaid flowchart LR O((object)) --> T[text] ``` What we have now defines links between two objects. (I'm using Work and Expression here to illustrate this, but it is true for all.) ```mermaid flowchart LR E((Expression)) --> |expresses| W((Work)) ``` Let's say that you have a book in translation, and the following information in your data store: --URI:Book3-- Title: "War and Peace" Original work: URI:Tolstoj1 This meets the current definition of the openWEMI vocabulary. But what if your database does not have a URI for the work, because you do not have that version in your database. But you might have information about the original title is a text. --URI:Book3-- Title: "War and Peace" Original work: "Война и мир" You may want to use the openWEMI property of `expresses` even though you do not have a URI for the work: ```mermaid flowchart LR E((Book3)) --> |expresses| W[Война и мир] ``` As the vocabulary is defined today, this requires the use of a blank node: ```mermaid flowchart LR E((Book3)) --> |expresses|B((work bnode)) --> |work title| W[Война и мир] ``` For the inverse properties that we have proposed, the situation is similar. If defined with ranges, such as: ``<http://example.org/openWEMI/expressedBy>`` `` a owl:ObjectProperty ;`` `` rdfs:label "expressedBy"@en ;`` `` skos:definition "A Work that is expressed by an Expression"@en ;`` `` rdfs:isDefinedBy <http://example.org/openWEMI/> ;`` `` rdfs:subPropertyOf <http://example.org/openWEMI/relatedEndeavor> ;`` `` rdfs:domain <http://example.org/openWEMI/Work> ;`` `` rdfs:range <http://example.org/openWEMI/Expression> .`` Which looks like: ```mermaid flowchart LR W((Work)) --> |expressedBy|B((Expression)) ``` However, the inverse `expressedBy` is useful even when the `Expression` is not identified with a URI: ```mermaid flowchart LR W((Work)) --> |expressedBy|B["Session 1"] ``` Again, if the property is defined with a range of `Expression` it will be necessary to use a bnode as the object of `expressedBy` so that a text string can represent the Expression. ```mermaid flowchart LR W((Work)) --> |expressedBy|B((Expression bnode)) --> |expression| E[Session 1] ``` ## Using Endeavor as range This assumes that the range of each property (expresses, manifests, instantiates) is Endeavor, while the domain of each is: `expresses` domain:Expression `manifests` domain:Manifestation `instantiates` domain:Instance In the case of: ```mermaid flowchart LR E((A)) --> |expresses| W((B)) ``` the inferences are: * A is an Expression * B is an Endeavor ```mermaid flowchart LR M((A)) --> |manifests|E E((B))--> |expresses| W((C)) ``` The inferences here are that * A is a Manifestation * B is an Endeavor * B is an Expression * C is an Endeavor Work is actually a special case here because there is no property for which work would be a domain. Work is only inferred if there is a inverse property, such that: `isExpressedby` domain:Work