# 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