- The ddot.it Relation Names
- The CDS Vocabulary
- Inference Rules
- r01 — transitive
- r02 — inverse (A-box)
- r03 — inverse (T-box) — not active
- r04 — type inheritance
- r05 — relation inheritance
- r06 — alias in subject position
- r07 — alias in predicate position
- r08 — alias in object position
- r09 — symmetric (A-box)
- r10 — self-inverse implies symmetric
- r11 — symmetric implies self-inverse
- r12 — inverse of inverse is the same relation
- r13 — inverse inherits type
- r14 — sameAs in subject position
- r15 — sameAs in predicate position
- r16 — sameAs in object position
- r17 — sub-type relation carries over to inverses
- r18 — tags propagate to parts
- Rule Sets
- Mapping the Two Vocabularies
- ECore Kernel
- Mapping to Standard Vocabularies
- Design Decisions
This document delivers background information about design decisions.
This document describes the relation vocabularies of ddot.it and the inference rules that come with them. It is the semantic layer that a ddot.it tool may apply on top of the plain triple stream produced by parsing (see the parsing spec). Nothing here affects the syntax: to the parser, all these relations are ordinary strings.
Two vocabularies are described:
- The ddot.it Relation Names
-
The small set of common relation names suggested for everyday ddot.it use.
- The CDS Vocabulary
-
CDS (Conceptual Data Structures), the full formal vocabulary with inverses, a relation hierarchy and inference rules.
The first is a human-facing subset; the second is what a reasoner works with. See Mapping the Two Vocabularies for how they relate.
ECore Kernel supplies the cardinality model, and Mapping to Standard Vocabularies aligns CDS with RDFS, OWL, SKOS and WordNet.
The ddot.it Relation Names
The ddot.it-facing relation names — related, links to, has type, has subtype, text, label and the rest — are not defined here. They are declared in the Vocabulary Specification, where each is a machine-readable built-in carrying its own has type, has supertype, has inverse, uri and has alias triples, checked against ddot-it-vocabulary.ddot by CI.
This document previously repeated those names in a hand-written table. The copy drifted from the declarations — listing has content as a relation of its own when it is an alias of text, and carrying aliases that were never declared — so it has been removed rather than re-synchronised. For the canonical name of any relation, and for its full set of aliases, read the vocabulary.
What remains here is the alignment material: the CDS vocabulary and its inference rules, the mapping between CDS and ddot.it, the ECore cardinality kernel, and the mappings to RDFS, OWL, SKOS and WordNet.
The CDS Vocabulary
CDS = Conceptual Data Structures.
Source of truth: de.xam.cds.CdsId (names, labels, inverses, transitivity), de.xam.cds.CdsIdT (axiomatic triples) and de.xam.cds.CdsRules (inference rules).
Background: "Personal Knowledge Models with Semantic Technologies", page 148 pp., available from xam.de/go/pkm.
Relations
Each relation has a technical id, a human-readable label, an inverse relation and — except for the root — a super-relation. The T column marks transitive relations, the S column marks symmetric relations (a relation is symmetric exactly when it is its own inverse).
| Id | Label | Inverse | Super-relation | T | S |
|---|---|---|---|---|---|
Layer 0 — root | |||||
hasRelated | is related to | hasRelated | _(none, root)_ | ✓ | |
Layer 1 — linking | |||||
hasSimilar | is similar to | hasSimilar | hasRelated | ✓ | |
hasTarget | links to | hasSource | hasRelated | ||
hasSource | is linked from | hasTarget | hasRelated | ||
Layer 2 — ordering, detail, annotation | |||||
hasAfter | comes before | hasBefore | hasTarget | ✓ | |
hasBefore | comes after | hasAfter | hasSource | ✓ | |
hasDetail | has detail | hasContext | hasTarget | ||
hasContext | has context | hasDetail | hasSource | ||
hasAnnotationMember | annotates | hasAnnotation | hasTarget | ||
hasAnnotation | has annotation | hasAnnotationMember | hasSource | ||
Layer 3 — tagging | |||||
hasTagMember | is tag of | hasTag | hasAnnotationMember | ||
hasTag | is tagged with | hasTagMember | hasAnnotation | ||
Layer 4 — typing | |||||
hasInstance | has instance | hasType | hasTagMember | ||
hasType | has type | hasInstance | hasTag | ||
Part-of and type hierarchy | |||||
hasPart | has part | isPartOf | hasDetail | ✓ | |
isPartOf | is part of | hasPart | hasContext | ✓ | |
hasSubType | has subtype | hasSuperType | hasDetail | ✓ | |
hasSuperType | is subtype of | hasSubType | hasContext | ✓ | |
Identity and aliasing | |||||
sameAs | is same as | sameAs | hasSimilar | ✓ | ✓ |
isAliasOf | is alias for | hasAlias | hasSimilar | ||
hasAlias | has alias | isAliasOf | hasSimilar | ||
replaces | replaces | replacedBy | hasSimilar | ||
replacedBy | is replaced by | replaces | hasSimilar | ||
Wiki / auto linking (added 2014-07-13) | |||||
hasAutoLinkTarget | auto-links to | hasAutoLinkSource | hasTarget | ||
hasAutoLinkSource | auto-linked from | hasAutoLinkTarget | hasSource | ||
hasManualLinkTarget | wiki-links to | hasManualLinkSource | hasTarget | ||
hasManualLinkSource | wiki-linked from | hasManualLinkTarget | hasSource | ||
CDS data model (the meta level) | |||||
hasInverse | has inverse | hasInverse | _(none)_ | ✓ | |
The super-relation is asserted in the axioms only for one direction of each inverse pair (e.g. hasRelated hasSubType hasTarget). The super-relation of the inverse side is not asserted; it follows from r17 — sub-type relation carries over to inverses. The table lists it explicitly for readability. |
Reading the labels
The label reads in subject-first direction: (x, hasAfter, y) is read as "x comes before y", and (x, hasSuperType, y) as "x is subtype of y". The id is written from the perspective of what the subject has; the label from the perspective of what the subject does. This is why some pairs look inverted at first glance.
Item Types
Three items — not relations — classify relations themselves:
| Id | Label |
|---|---|
type_relation | relation |
type_symmetricRelation | symmetric relation |
type_transitiveRelation | transitive relation |
Both type_symmetricRelation and type_transitiveRelation are sub-types of type_relation.
Axiomatic Triples
For every relation pair (r, inv) with super-relation sup, these triples are asserted:
(r, hasType, type_relation) (inv, hasType, type_relation) (r, hasInverse, inv) (sup, hasSubType, r)
Plus the relation-type assertions:
(hasAfter, hasType, type_transitiveRelation) (hasBefore, hasType, type_transitiveRelation) (sameAs, hasType, type_transitiveRelation) (hasSubType, hasType, type_transitiveRelation) (hasSuperType, hasType, type_transitiveRelation) (hasPart, hasType, type_transitiveRelation) (hasInverse, hasType, type_symmetricRelation) (sameAs, hasType, type_symmetricRelation) (hasRelated, hasType, type_symmetricRelation) (type_relation, hasSubType, type_symmetricRelation) (type_relation, hasSubType, type_transitiveRelation)
Inference Rules
The rules are forward-chaining production rules over triples. ?x denotes a variable, quoted names denote fixed relations from Relations. Conditions are listed above the =⇒, the derived triple below.
r01 — transitive
Transitive closure for any relation declared transitive.
?x ?p ?y ?y ?p ?z ?p 'hasType' 'type_transitiveRelation' ==> ?x ?p ?z
r02 — inverse (A-box)
Every statement also holds in the inverse direction.
?x ?p ?y ?p 'hasInverse' ?q ==> ?y ?q ?x
r03 — inverse (T-box) — not active
hasInverse symmetry. This rule is configured but not registered with the engine: the axiomatic triple (hasInverse, hasType, type_symmetricRelation) combined with r09 — symmetric (A-box) achieves the same.
?p 'hasInverse' ?q ==> ?q 'hasInverse' ?p
r04 — type inheritance
An instance of a type is also an instance of that type’s super-types.
?x 'hasType' ?t ?t 'hasSuperType' ?u ==> ?x 'hasType' ?u
r05 — relation inheritance
A statement using a relation also holds for that relation’s super-relations.
?x ?p ?y ?p 'hasSuperType' ?u ==> ?x ?u ?y
| r05 — relation inheritance can trigger r01 — transitive, so the two must be registered together for a complete closure. |
r11 — symmetric implies self-inverse
The converse of r10 — self-inverse implies symmetric; together they make the two formulations equivalent.
?p 'hasType' 'type_symmetricRelation' ==> ?p 'hasInverse' ?p
r12 — inverse of inverse is the same relation
?p 'hasInverse' ?q ?q 'hasInverse' ?r ==> ?p 'sameAs' ?r
r13 — inverse inherits type
A relation and its inverse share all types (both transitive, both symmetric, …).
?p 'hasInverse' ?q ?p 'hasType' ?t ==> ?q 'hasType' ?t
r17 — sub-type relation carries over to inverses
If a is a sub-relation of c, then the inverse of a is a sub-relation of the inverse of c. This is what gives the inverse-side relations in Relations their super-relation.
?a 'hasInverse' ?b ?c 'hasInverse' ?d ?a 'hasSuperType' ?c ==> ?b 'hasSuperType' ?d
r18 — tags propagate to parts
Added 2015-12-29. A tag on a whole applies to each of its parts.
?a 'hasTag' ?tag ?a 'hasPart' ?part ==> ?part 'hasTag' ?tag
Rule Sets
Rules are grouped so that an implementation can trade completeness for speed:
| Group | Rules | Note |
|---|---|---|
transitive | The expensive one — closure can blow up | |
inverse | r03 — inverse (T-box) — not active configured but not registered | |
symmetric | r09 — symmetric (A-box), r10 — self-inverse implies symmetric, r11 — symmetric implies self-inverse | |
alias | r06 — alias in subject position, r07 — alias in predicate position, r08 — alias in object position | |
sameAs | r12 — inverse of inverse is the same relation, r14 — sameAs in subject position, r15 — sameAs in predicate position, r16 — sameAs in object position | r12 — inverse of inverse is the same relation derives |
type inheritance | r04 — type inheritance, r05 — relation inheritance, r17 — sub-type relation carries over to inverses | |
part |
Predefined configurations:
All-
All of the above.
AllExceptTransitive-
Everything but r01 — transitive. The common choice when the closure is too costly.
OnlyTransitive-
r01 — transitive only.
None-
No inference.
Cost Model
When a rule engine picks an evaluation order for the conditions of a rule, it counts unbound variables and adds a penalty per relation, reflecting how often that relation typically occurs:
| Relation | Penalty | Frequency |
|---|---|---|
hasSubType | 0.2 | rare |
hasSuperType | 0.2 | rare |
hasInverse | 0.2 | rare |
sameAs | 0.7 | medium |
hasAlias | 0.8 | medium |
isAliasOf | 0.8 | medium |
hasType | 0.9 | frequent |
hasInstance | 0.9 | frequent |
_all others_ | 0 |
The penalty applies only when the predicate itself is bound but subject or object are not.
Mapping the Two Vocabularies
Every relation declared in the Vocabulary Specification, and how it corresponds to CDS. Ddot.it uses the CDS labels rather than the CDS ids.
| ddot.it name | CDS id | Note |
|---|---|---|
related | hasRelated | Symmetric root relation |
has inverse | hasInverse | Symmetric; pairs a relation with its opposite |
has similar | hasSimilar | Symmetric |
same as | sameAs | Symmetric and transitive |
is alias of | isAliasOf | Inverse |
replaces | replaces | Inverse |
links to | hasTarget | Inverse |
has next | hasAfter | Inverse |
has detail | hasDetail | Inverse |
has part | hasPart | Inverse |
has subtype | hasSubType | Inverse |
annotates | hasAnnotationMember | Inverse |
is tag of | hasTagMember | Inverse |
has instance | hasInstance | Inverse |
None of these has a CDS counterpart: CDS models values through its own data model rather than through a property hierarchy.
| ddot.it name | CDS id | Note |
|---|---|---|
has property | -- | Root of the value-carrying family; the type is |
label | -- | The visible name of a node |
text | -- | Free content; alias |
uri | -- | Identifying relation |
prefix | -- | A parsing directive, not a semantic relation |
source uri | -- | Provenance |
collected | -- | Provenance |
valid since | -- | Provenance |
valid until | -- | Provenance |
last modified | -- | Provenance |
grade | -- | Replaces the four CDS auto/manual-link relations, see below |
Of the 28 relations in the CDS relation table, 24 have a ddot.it counterpart above — both directions of every inverse pair. The remaining four are deliberately not carried over:
| CDS | Superseded by |
|---|---|
hasAutoLinkTarget / hasAutoLinkSource |
|
hasManualLinkTarget / hasManualLinkSource |
|
CDS encoded link provenance in the relation name; ddot.it encodes it as grade meta on an ordinary links to, which keeps the link itself one relation. The exact rewrite is tabulated in the vocabulary’s "Migration from CDS".
Differences to reconcile:
-
ddot.it says tags are not transitive; CDS does not declare
hasTagtransitive either — consistent. -
ddot.it says a
has subtypecycle collapses tosame as; CDS has no rule for this. r12 — inverse of inverse is the same relation derivessameAsfrom inverse chains only.
replaces / is replaced by are declared transitive in the Vocabulary Specification, and in the generated ddot-it-vocabulary.ddot. CDS does not: neither replaces nor replacedBy appears in the transitive axiom list, and the CDS relation table above accordingly leaves their T column empty.
This is a deliberate ddot.it addition, not a transcription error. If a replaces b and b replaces c, then a replaces c is what a reader expects, and the inference is monotonic like every other. The CDS tables in this document describe CDS, so they are left unmarked; the divergence is recorded here instead of being hidden by editing either side.
has subtype cycles collapse to same as. If a has subtype b and b has subtype a, the vocabulary concludes a ..same as.. b — every participant of the cycle is one entity. CDS has no such rule: r12 — inverse of inverse is the same relation derives sameAs from chains of inverses only, and nothing in the CDS rule set closes a subtype cycle.
The addition is what keeps a cycle from being an error. In a monotonic language nothing can be rejected, so a subtype cycle has to mean something; reading it as identity is both the useful answer and the one that adds inferences rather than removing them.
By contrast, isPartOf is marked transitive in the CDS table above even though the axiom list names only hasPart. That is not an addition: r13 — inverse inherits type ("a relation and its inverse share all types") forces it, and CDS spells out both sides for the comparable hasSubType/hasSuperType pair. The unmarked isPartOf was an omission in the table. |
ECore Kernel
Ecore is the meta-model of EMF. It is the closest well-established model to what ddot.it needs for cardinalities, so we borrow its kernel here.
Indentation is rdfs:subClassOf:
-
ENamedElement ..hasName.. String
-
EClassifier
-
EClass
-
EDataType
-
-
ETypedElement ..hasEType.. an EClassifier
-
EStructuralFeature
-
EAttribute
-
EReference
-
-
-
Cardinality
Cardinality in Ecore is not a separate class. It is four attributes on ETypedElement, and therefore inherited by every EAttribute and EReference:
| Attribute | Type | Default | Meaning |
|---|---|---|---|
lowerBound | EInt | 0 | Minimum number of values. |
upperBound | EInt | 1 | Maximum number of values. |
ordered | EBoolean | true | Whether the order of multiple values is meaningful. |
unique | EBoolean | true | Whether duplicate values are forbidden. |
Two further attributes are derived — they are not stored, they follow from the bounds:
| Derived attribute | Definition |
|---|---|
required |
|
many |
|
The four combinations that cover almost all practical cases:
| Notation | lowerBound | upperBound | Meaning |
|---|---|---|---|
| 0 | 1 | Optional single value |
| 1 | 1 | Exactly one — required single value |
| 0 | -1 | Any number, including none |
| 1 | -1 | At least one |
ordered and unique only matter when many is true. With unique = true and ordered = false a multi-valued feature behaves like a set, with both true like an ordered set, with unique = false and ordered = true like a list. |
Writing Cardinality in ddot.it
Ddot.it declares this model as built-ins — see Cardinality in the Vocabulary Specification. Bounds are written as two separate properties, each taking a plain integer:
Person ..has address.. Address ,, ..min cardinality.. 1 ;; ..max cardinality.. 3 Person ..has name.. String ,, ..cardinality.. 1
An omitted max cardinality means unbounded; there is no or -1 sentinel. The named shorthands required, single valued and multi valued cover the common cases as relation *types.
A range written as one value — 1..3 — is not used. It parses where it stands, since a meta object may contain .., but the same string reused as a subject silently misparses (1..3 ..has type.. cardinality reads as subject 1, relation 3). Two bounds avoid the collision entirely. |
| ECore | ddot.it | Note |
|---|---|---|
lowerBound | min cardinality | Declared alias |
upperBound | max cardinality | Declared alias |
required | required | ECore derives it; ddot.it declares it as a relation type |
many | multi valued | ECore derives it; in ddot.it it is the default, so it only documents intent |
ordered | -- | Not modelled: ddot.it triples have no inherent order |
unique | -- | Not modelled: a ddot.it triple base is a set, so duplicates do not arise |
Beyond Cardinality
The remaining Ecore kernel attributes are listed here for completeness; ddot.it does not currently assign them a meaning.
| Class | Attribute | Meaning |
|---|---|---|
EClass | abstract | Cannot be instantiated directly |
EClass | interface | Has no implementation |
EStructuralFeature | changeable | May be modified after creation |
EStructuralFeature | derived | Computed, not stored |
EStructuralFeature | transient | Not serialised |
EAttribute | iD | Serves as the identifier of its instances |
EReference | containment | The target is owned by the source (composition) |
EReference | eOpposite | The inverse reference — compare CDS |
EDataType | serializable | Values can be converted to and from a string |
EReference.eOpposite and CDS hasInverse express the same idea, and EReference.containment overlaps with CDS hasPart. Those equivalences are recorded here, but the rest of the ECore kernel is not imported: ddot.it borrows ECore only as its cardinality model. The remaining attributes above are implementation concerns of a modelling framework (serialisation, mutability, abstractness) rather than statements about a knowledge graph, and they have no ddot.it counterpart. |
Mapping to Standard Vocabularies
CDS was designed independently, but it overlaps heavily with the established semantic web vocabularies. This chapter lists the relations that actually get used in practice from each, and how they map.
The Fit column is used throughout:
| Exact. Same meaning, same direction, same formal properties. |
| Close. Usable, but something is lost — direction, transitivity, or scope. |
| No CDS equivalent. |
CDS has no negation and no notion of inconsistency. The rules in Inference Rules derive triples and nothing else — there is no way to write "not", and no outcome other than "here are more triples". Constructs such as owl:differentFrom, owl:disjointWith or WordNet’s antonym therefore have no CDS counterpart: they do their work by making a knowledge base unsatisfiable, which presupposes a reasoner that can detect and report a contradiction. Adding them to CDS means adding a consistency check, not just a relation. |
| This is not a monotonicity difference — RDFS, OWL and CDS are all monotonic. Adding statements never retracts an earlier conclusion in any of them. |
RDFS
Namespaces: rdf: = http://www.w3.org/1999/02/22-rdf-syntax-ns#, rdfs: = http://www.w3.org/2000/01/rdf-schema#
RDFS is the smallest of the four and the closest to CDS in spirit — a handful of relations, a subclass hierarchy, and entailment rules that only add triples.
| RDFS | Fit | CDS | Note |
|---|---|---|---|
rdf:type | = | hasType | Same direction, same meaning. |
rdfs:subClassOf | = | hasSuperType |
|
rdfs:subPropertyOf | ~ | hasSuperType | CDS uses one hierarchy for items and relations alike; RDFS keeps class and property hierarchies apart. |
rdfs:label | ~ | -- | Maps to the ddot.it |
rdfs:comment | ~ | hasDetail | Or the ddot.it |
rdfs:seeAlso | = | hasTarget | The untyped directed link. ddot.it |
rdfs:isDefinedBy | ~ | hasContext |
|
rdfs:member | ~ | isPartOf | CDS |
rdfs:domain | – | -- | Constrains the subject of a property. See ECore Kernel. |
rdfs:range | – | -- | Constrains the object of a property. See ECore Kernel. |
rdf:value | – | -- | Structured-value idiom; the ddot.it |
rdf:first, rdf:rest, rdf:nil | – | -- | RDF list encoding. No CDS ordering primitive; CDS has |
Classes rather than relations, listed for orientation: rdfs:Resource, rdfs:Class, rdf:Property, rdfs:Literal, rdfs:Datatype, rdfs:Container.
RDFS entailment rules rdfs9 (type inheritance) and rdfs7 (property inheritance) correspond exactly to CDS r04 — type inheritance and r05 — relation inheritance. rdfs5 and rdfs11 (transitivity of subPropertyOf / subClassOf) correspond to r01 — transitive applied to hasSuperType. |
OWL
Namespace: owl: = http://www.w3.org/2002/07/owl#
OWL is where CDS finds its closest formal matches: hasInverse, sameAs, type_symmetricRelation and type_transitiveRelation are all direct OWL analogues. It is also where CDS stops — OWL’s class constructors and negation have no counterpart.
| OWL | Fit | CDS | Note |
|---|---|---|---|
owl:inverseOf | = | hasInverse | Direct match. Compare r02 — inverse (A-box). |
owl:sameAs | = | sameAs | Direct match. Compare r14 — sameAs in subject position–r16 — sameAs in object position. |
owl:SymmetricProperty | = | type_symmetricRelation | Direct match. Compare r09 — symmetric (A-box). |
owl:TransitiveProperty | = | type_transitiveRelation | Direct match. Compare r01 — transitive. |
owl:equivalentClass | ~ | sameAs | CDS does not separate class-level from individual-level identity. |
owl:equivalentProperty | ~ | sameAs | CDS derives this via r12 — inverse of inverse is the same relation. |
owl:topObjectProperty | = | hasRelated | The root of the relation hierarchy. |
owl:ObjectProperty | ~ | type_relation | Compare Ecore |
owl:DatatypeProperty | ~ | -- | Compare Ecore |
owl:FunctionalProperty | ~ | -- | Ecore |
owl:InverseFunctionalProperty | ~ | -- | Ecore |
owl:minCardinality | ~ | -- | Ecore |
owl:maxCardinality | ~ | -- | Ecore |
owl:differentFrom | – | -- | Negative. Not expressible in CDS. |
owl:disjointWith | – | -- | Negative. Not expressible in CDS. |
owl:complementOf | – | -- | Negative. Not expressible in CDS. |
owl:unionOf, owl:intersectionOf | – | -- | Class constructors. CDS has no anonymous classes. |
owl:Restriction, owl:onProperty, owl:someValuesFrom, owl:allValuesFrom | – | -- | Property restrictions. CDS has no anonymous classes. |
owl:imports | – | -- | Document-level, not statement-level. |
owl:deprecated | ~ | replacedBy | Only when a successor is named. |
| CDS is roughly at the expressiveness of OWL RL minus the negative constructs — property hierarchies, inverses, symmetry, transitivity and identity, all as forward-chaining rules that only ever add triples. |
SKOS
Namespace: skos: = http://www.w3.org/2004/02/skos/core#
SKOS models concept schemes — thesauri, taxonomies, subject headings — rather than logical classes. Because it is deliberately informal about what a hierarchy means, it sits closer to everyday ddot.it usage than OWL does.
| SKOS | Fit | CDS | Note |
|---|---|---|---|
skos:related | = | hasRelated | Symmetric, non-transitive. The best match in the whole chapter. |
skos:closeMatch | = | hasSimilar | Symmetric. Direct match. |
skos:exactMatch | = | sameAs | Transitive and symmetric in both vocabularies. |
skos:broaderTransitive | = | hasSuperType | Transitive in both. |
skos:narrowerTransitive | = | hasSubType | Transitive in both. |
skos:broader | ~ | hasSuperType | Mismatch: |
skos:narrower | ~ | hasSubType | Same mismatch, mirrored. |
skos:prefLabel | ~ | -- | The ddot.it |
skos:altLabel | ~ | hasAlias | CDS aliasing also rewrites triples (r06 — alias in subject position–r08 — alias in object position); SKOS labels do not. |
skos:hiddenLabel | – | -- | Search-only label. No CDS concept. |
skos:definition | ~ | hasDetail | Or ddot.it |
skos:note, skos:scopeNote, skos:editorialNote | ~ | hasAnnotation | The CDS annotation layer. |
skos:example | ~ | hasInstance | Informal in SKOS, formal in CDS. |
skos:member | ~ | hasPart | For |
skos:inScheme | ~ | hasTag | Membership in a concept scheme. |
skos:hasTopConcept | ~ | hasPart | Entry point of a scheme. |
skos:notation | – | -- | A code in a notation system. |
skos:broadMatch, skos:narrowMatch, skos:relatedMatch | ~ | hasSuperType, hasSubType, hasRelated | Cross-scheme variants of the corresponding intra-scheme relations. CDS does not distinguish. |
The skos:broader transitivity mismatch is the one to watch when importing a thesaurus. SKOS separates broader from broaderTransitive precisely so that hierarchies with mixed part-of / kind-of steps do not produce nonsense conclusions. Importing skos:broader as CDS hasSuperType re-enables exactly the inference SKOS was avoiding. Map to hasDetail / hasContext instead when this matters. |
WordNet
Namespace (W3C 2006 conversion): wn: = http://www.w3.org/2006/03/wn/wn20/schema/. See also the Global WordNet schemas.
WordNet is a lexical database: its nodes are word senses grouped into synsets, not concepts. The mapping is therefore approximate throughout — a WordNet relation holds between meanings of words, a CDS relation between things.
A WordNet row names a pointer, and a pointer is read from the synset that carries it to the synset it names. The CDS column gives the relation holding in that same direction, so the carrier of the pointer is always the CDS subject.
This matters most for the part/whole pairs, where the names invite the opposite reading: a holonym pointer runs from the part to the whole (tree --member holonym-→ forest), so its subject is the part and it maps to isPartOf. A meronym pointer runs from the whole to the part, and maps to hasPart. The prose notes below read in the same direction.
| WordNet | Fit | CDS | Note |
|---|---|---|---|
hypernym | = | hasSuperType | "is a kind of". Transitive in both. |
hyponym | = | hasSubType | Inverse of hypernym. |
instance hypernym | = | hasType | For named individuals — Berlin is an instance of city. |
instance hyponym | = | hasInstance | Inverse of the above. |
member holonym | ~ | isPartOf | tree is a member of forest. |
member meronym | ~ | hasPart | Inverse. |
part holonym | ~ | isPartOf | branch is a part of tree. |
part meronym | ~ | hasPart | Inverse. |
substance holonym | ~ | isPartOf | wood is the substance of tree. |
substance meronym | ~ | hasPart | Inverse. |
similar to | = | hasSimilar | Adjective satellites. Symmetric in both. |
also see | = | hasTarget | The untyped "see also" link. |
derivationally related form | ~ | hasRelated | Symmetric in both. decide / decision. |
domain — topic | ~ | hasTag | The subject field of a synset. A good |
member of domain — topic | ~ | hasTagMember | Inverse. |
synset membership | ~ | sameAs | Words in one synset share a meaning. Lossy: synonymy is context-dependent, |
gloss / definition | ~ | hasDetail | Or ddot.it |
lemma / word form | ~ | -- | The ddot.it |
antonym | – | -- | Negative. Not expressible in CDS. |
entailment | – | -- | snore entails sleep. Verb-specific. |
cause | – | -- | kill causes die. Verb-specific. |
verb group | – | -- | Groups related verb senses. |
attribute | – | -- | Links a noun to a descriptive adjective. |
pertainym | – | -- | dental pertains to tooth. |
The synset membership → sameAs mapping is the dangerous one. CDS sameAs is transitive and symmetric and rewrites triples through r14 — sameAs in subject position–r16 — sameAs in object position, so importing synonymy as sameAs will merge word senses that WordNet keeps carefully apart. Prefer hasSimilar, which is symmetric but not transitive and triggers no rewriting. |
Summary
The relations that map exactly across all four:
| CDS | Corresponds to |
|---|---|
hasType |
|
hasSuperType |
|
hasInverse |
|
sameAs |
|
hasRelated |
|
hasSimilar |
|
hasTarget |
|
type_symmetricRelation |
|
type_transitiveRelation |
|
What CDS has that the others lack: a single unified hierarchy for items and relations, and the alias mechanism (r06 — alias in subject position–r08 — alias in object position), which rewrites triples rather than merely asserting equivalence.
What CDS lacks: negation of any kind, cardinality (borrowed from ECore Kernel), domain and range constraints, and anonymous classes.
Design Decisions
Which CDS relations belong to the ddot.it core. All of them that have a counterpart: the mapping tables list every relation the Vocabulary Specification declares, and Coverage records that 24 of the 28 CDS relations map directly while the four link-provenance relations are superseded by grade. Anything in the CDS relation table that does not appear in the mapping is CDS-only and not part of ddot.it.
Surface form. Ddot.it writes the vocabulary’s own names — has subtype, links to, same as — not CDS ids and not CDS labels. Those names, and their aliases, are declared as built-ins and checked by CI. This side-steps the label/id direction hazard entirely: a ddot.it name means what the vocabulary declares, and the CDS id is given alongside it in the mapping tables for anyone reading CDS sources.
Cardinality. Settled in the Vocabulary Specification: two integer bounds (min cardinality / max cardinality), an omitted maximum meaning unbounded, cardinality as the equal-bounds shorthand, and required / single valued / multi valued as relation types. ordered and unique are out of scope — see the name mapping in Writing Cardinality in ddot.it for why.
Status of the alignment tables. The mappings in Mapping to Standard Vocabularies are descriptive, with one normative core.
hasInstance has hasTagMember as its super-relation, which places typing below tagging in the CDS hierarchy. This is intentional: Fig. 4.5 of the source thesis (Personal Knowledge Models with Semantic Technologies, p. 122) shows has instance as a sub-relation of is tag of, so that a hasType b implies a hasTag b and type- and tag-browsing share one user interface. |