pldn / LDWizard

🧙 LDWizard: A generic framework for simplifying the creation of linked data. Supported by the PLDN community.
European Union Public License 1.2
13 stars 7 forks source link

`owl:sameAs` relation is incorrect #162

Closed philipperenzen closed 9 months ago

philipperenzen commented 10 months ago

When using keepOriginalValue, if no custom IRI is used in the configuration of the transformation, an owl:same relation is created. However this relation is incorrect w.r.t. the value it is referring to.

I propose 2 changes:

  1. By default create an owl:sameAs relationship, optionally use the cuscustomPredicateIRI
  2. Add option to not create owl:sameAs relationship in keepOriginalValueOptions
    keepOriginalValueOptions = {
    keepValue: boolean
    customPredicateIRI?: string
    disableSameAs?: boolean
    keepAsIri?: boolean
    keepAsLiteral?: boolean
    }
  3. Fix the relation modeling:

Imagine there is the following CSV:

RowNumber,Age
1,20
2,25

LDWizard should transform this into the triples:

ex:RowNumber/1 ex:predicate/Age "20"
ex:RowNumber/2 ex:predicate/Age "25"

Now in this configuration we use a column refinement transformation fromNumericToTextualValue that will create a new triple from the "Age" column value, but in textual form:

ex:RowNumber/1 ex:predicate/Age "20"
ex:RowNumber/1 ex:predicate/Age-refined "twenty"
ex:RowNumber/2 ex:predicate/Age "25"
ex:RowNumber/2 ex:predicate/Age-refined "twenty-five"

The relation to the original value using owl:sameAs should thus be as follows for literals as object (keepAsLiteral):

ex:RowNumber/1 ex:predicate/Age :AgeValue1
ex:RowNumber/1 ex:predicate/Age-refined :Age-refinedValue1
ex:RowNumber/2 ex:predicate/Age :AgeValue2
ex:RowNumber/2 ex:predicate/Age-refined :Age-refinedValue2

:AgeValue1 rdf:type owl:NamedIndividual ;
           rdf:value "20";
           rdf:comment "Original literal value".

:Age-refinedValue1 rdf:type owl:NamedIndividual ;
           rdf:value "twenty" ;
           rdf:comment "Refined literal value";

:AgeValue2 rdf:type owl:NamedIndividual ;
           rdf:value "25";
           rdf:comment "Original literal value".

:Age-refinedValue2 rdf:type owl:NamedIndividual ;
           rdf:value "twenty-five" ;
           rdf:comment "Refined literal value";

:ageValue1 owl:sameAs :Age-refinedValue1
:ageValue2 owl:sameAs :Age-refinedValue2

And look like this for IRIs as object (keepAsIri):

ex:RowNumber/1 ex:predicate/Age ex:20
ex:RowNumber/1 ex:predicate/Age-refined ex:twenty
ex:RowNumber/2 ex:predicate/Age ex:25
ex:RowNumber/2 ex:predicate/Age-refined ex:twenty-five

ex:20 owl:sameAs ex:twenty
ex:25 owl:sameAs ex:twenty-five