Search code examples
rdfsemantic-webstatic-linkingowlrdfs

Link object to subject in RDF domain


I have this RDF file:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:j.0="http://relation/"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"> 
  <rdf:Description rdf:about="soggetto">
    <j.0:Nome>Vercelli</j.0:Nome>
    <j.0:Regione>Piemonte</j.0:Regione>
  </rdf:Description>
  <rdf:Description rdf:about="Piemonte">
    <rdfs:label>Piemonte</rdfs:label>
  </rdf:Description>
  <rdf:Description rdf:about="Regione">
    <rdfs:label>Regione</rdfs:label>
    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
  </rdf:Description>
  <rdf:Description rdf:about="Vercelli">
    <rdfs:label>Vercelli</rdfs:label>
  </rdf:Description>
  <rdf:Description rdf:about="Nome">
    <rdfs:label>Nome</rdfs:label>
    <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
  </rdf:Description>
</rdf:RDF>

I would like to link Piemonte and Vercelli objects (in the "soggetto" subject) with Piemonte and Vercelli subjects, and I would like to link Regione and Nome predicates (in the "soggetto" subject) with Regione and Nome subjects.

For me, Vercelli subject is equal to Vercelli object, Piemonte subject is equal to Piemonte object, Regione predicate is equal to Regione subject, and Nome predicate is equal to Nome subject.

How I can accomplish this? Can I use rdf:type predicate to make Vercelli object equal to Vercelli subject? Or does another attribute exist?


Solution

  • I think that what you're really asking is how to use the resource as the object of some of the subjects instead of the a string that happens to have similar content. First, let's add an xml:base and an xmlns to your data, so that it's a bit more predictble:

    <rdf:RDF
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns:j.0="http://stackoverflow.com/q/24084473/1281433/relations/"
        xml:base="http://stackoverflow.com/q/24084473/1281433/"
        xmlns="http://stackoverflow.com/q/24084473/1281433/"
        xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"> 
      <rdf:Description rdf:about="soggetto">
        <j.0:Nome>Vercelli</j.0:Nome>
        <j.0:Regione>Piemonte</j.0:Regione>
      </rdf:Description>
      <rdf:Description rdf:about="Piemonte">
        <rdfs:label>Piemonte</rdfs:label>
      </rdf:Description>
      <rdf:Description rdf:about="Regione">
        <rdfs:label>Regione</rdfs:label>
        <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
      </rdf:Description>
      <rdf:Description rdf:about="Vercelli">
        <rdfs:label>Vercelli</rdfs:label>
      </rdf:Description>
      <rdf:Description rdf:about="Nome">
        <rdfs:label>Nome</rdfs:label>
        <rdf:type rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#Property"/>
      </rdf:Description>
    </rdf:RDF>
    

    Now, it's much easier to work with a Turtle/N3 serialization than with RDF/XML, so let's look at the same data in Turtle:

    @prefix :      <http://stackoverflow.com/q/24084473/1281433/> .
    @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix j.0:   <http://stackoverflow.com/q/24084473/1281433/relations/> .
    
    :Nome   a           rdf:Property ;
            rdfs:label  "Nome" .
    
    :Regione  a         rdf:Property ;
            rdfs:label  "Regione" .
    
    :Vercelli  rdfs:label  "Vercelli" .
    
    :soggetto  j.0:Nome  "Vercelli" ;
            j.0:Regione  "Piemonte" .
    
    :Piemonte  rdfs:label  "Piemonte" .
    

    It's much easier to see the structure of the data, and to see what to do to fix it. It sounds like rather than saying

    :soggetto  j.0:Nome  "Vercelli" ;
            j.0:Regione  "Piemonte" .
    

    you'd like to have the region of :soggetto be the resource :Piemonte, which you can do simply by using :Piemonte instead of "Piemonte". Then your data, in Turtle and RDF/XML would be

    @prefix :      <http://stackoverflow.com/q/24084473/1281433/> .
    @prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix j.0:   <http://stackoverflow.com/q/24084473/1281433/relations/> .
    
    :Nome   a           rdf:Property ;
            rdfs:label  "Nome" .
    
    :Regione  a         rdf:Property ;
            rdfs:label  "Regione" .
    
    :Vercelli  rdfs:label  "Vercelli" .
    
    :soggetto  j.0:Nome  "Vercelli" ;
            j.0:Regione  :Piemonte .
    
    :Piemonte  rdfs:label  "Piemonte" .
    
    <rdf:RDF
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns="http://stackoverflow.com/q/24084473/1281433/"
        xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
        xmlns:j.0="http://stackoverflow.com/q/24084473/1281433/relations/">
      <rdf:Property rdf:about="http://stackoverflow.com/q/24084473/1281433/Regione">
        <rdfs:label>Regione</rdfs:label>
      </rdf:Property>
      <rdf:Property rdf:about="http://stackoverflow.com/q/24084473/1281433/Nome">
        <rdfs:label>Nome</rdfs:label>
      </rdf:Property>
      <rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/soggetto">
        <j.0:Nome>Vercelli</j.0:Nome>
        <j.0:Regione>
          <rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/Piemonte">
            <rdfs:label>Piemonte</rdfs:label>
          </rdf:Description>
        </j.0:Regione>
      </rdf:Description>
      <rdf:Description rdf:about="http://stackoverflow.com/q/24084473/1281433/Vercelli">
        <rdfs:label>Vercelli</rdfs:label>
      </rdf:Description>
    </rdf:RDF>