Импортиране на йерархията на класовете на DBpedia

Използвам свойствата и типовете информационни кутии на DBPedia, за да импортирам данни от DBPedia. Въпреки това все още пропускам отношенията между класовете. Как мога ефективно да извлека йерархията на типове по относително лесен начин? Мислех за съпоставяне на типове DBpedia към типове Yago и след това извличане на йерархията на типове yago, използвайки

Има ли по-лесен или по-прост подход за разрешаване на това?


person Stefan Kunze    schedule 18.10.2013    source източник
comment
Искате ли само онтологията? Това съдържа rdfs:subClassOf отношения между класовете.   -  person Joshua Taylor    schedule 18.10.2013
comment
да - имате ли препоръка как да извлечете данните - по-специално ме интересува само връзката subClassof в Java / Scala?   -  person Stefan Kunze    schedule 19.10.2013
comment
Ако използвате Java, има няколко налични библиотеки. Йена и сусам се използват често. Можете да изпълните SPARQL заявка, като поискате тройките, като използвате rdfs:subClass (и можете да поискате всички неща, които имат rdf:type rdfs:Class, докато сте там). Можете също така да получите тези резултати програмно чрез модела на Jena и метода listStatements, но SPARQL заявката е може би най-лесният начин.   -  person Joshua Taylor    schedule 19.10.2013


Отговори (1)


Можете или да направите това програмно, като използвате един от API за работа с RDF, или можете да го направите, като използвате инструменти за RDF заявки като SPARQL. И в двата случая ще искате да изтеглите онтологията на DBpedia (онтология на OWL, сериализирана в RDF/XML).

Използване на Jena API за итерация през тройки

Използвайки Jena, можете да заредите данните в Модел и след това използвайте listStatements, за да изберете изразите, които имат rdfs:subClassOf като свой предикат. Имайте предвид, че null се използва като заместващ знак.

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;
import com.hp.hpl.jena.vocabulary.RDFS;

public class IterateRDFSSubclassTriples {
    public static void main(String[] args) {
        final Model dbpedia = ModelFactory.createDefaultModel();
        dbpedia.read( "/home/taylorj/Downloads/dbpedia_3.9.owl", "RDF/XML" );
        final StmtIterator stmts = dbpedia.listStatements(null, RDFS.subClassOf, (RDFNode) null);
        while ( stmts.hasNext() ) {
            final Statement stmt = stmts.next();
            System.out.println( stmt.getSubject() + " is a subclass of " + stmt.getObject() );
        }
    }
}

Това произвежда резултат като този:

http://dbpedia.org/ontology/FilmFestival is a subclass of http://schema.org/Festival
http://dbpedia.org/ontology/Embryology is a subclass of http://dbpedia.org/ontology/AnatomicalStructure
http://dbpedia.org/ontology/Canal is a subclass of http://dbpedia.org/ontology/Stream
http://dbpedia.org/ontology/Fern is a subclass of http://dbpedia.org/ontology/Plant
http://dbpedia.org/ontology/Architect is a subclass of http://dbpedia.org/ontology/Person
…

Използване на SPARQL

Можете да изпълните следната SPARQL заявка, за да извлечете всички подкласове и суперкласове от rdfs:subClassOf тройки:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select ?subclass ?superclass where {
  ?subclass rdfs:subClassOf ?superclass
}

Използвайки инструмента sparql на командния ред на Jena, намираме 541 такива тройки:

$ sparql --query query.rq --data dbpedia_3.9.owl | head
-----------------------------------------------------------------------------------------------------------------------------------------------
| subclass                                                                   | superclass                                                     |
===============================================================================================================================================
| <http://dbpedia.org/ontology/FilmFestival>                                 | <http://schema.org/Festival>                                   |
| <http://dbpedia.org/ontology/Embryology>                                   | <http://dbpedia.org/ontology/AnatomicalStructure>              |
| <http://dbpedia.org/ontology/Canal>                                        | <http://dbpedia.org/ontology/Stream>                           |
| <http://dbpedia.org/ontology/Fern>                                         | <http://dbpedia.org/ontology/Plant>                            |
| <http://dbpedia.org/ontology/Architect>                                    | <http://dbpedia.org/ontology/Person>                           |
...
| <http://dbpedia.org/ontology/LegalCase>                                    | <http://dbpedia.org/ontology/Case>                             |
| <http://dbpedia.org/ontology/Lymph>                                        | <http://dbpedia.org/ontology/AnatomicalStructure>              |
| <http://dbpedia.org/ontology/City>                                         | <http://dbpedia.org/ontology/Settlement>                       |
-----------------------------------------------------------------------------------------------------------------------------------------------

Ако искате тези данни като графика, можете да използвате вместо това construct заявка и ще имате на разположение редица изходни формати:

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

construct where {
  ?subclass rdfs:subClassOf ?superclass
}
$ sparql --query query.rq --data dbpedia_3.9.owl | head -20
@prefix :      <http://dbpedia.org/ontology/> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

:PoloLeague  rdfs:subClassOf  :SportsLeague .
:RacingDriver  rdfs:subClassOf  :Athlete .
:ResearchProject  rdfs:subClassOf  :Project .
# ...
$ sparql -out NT --query query.rq --data dbpedia_3.9.owl | head -20
<http://dbpedia.org/ontology/PoloLeague> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://dbpedia.org/ontology/SportsLeague> .
<http://dbpedia.org/ontology/RacingDriver> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://dbpedia.org/ontology/Athlete> .
<http://dbpedia.org/ontology/ResearchProject> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://dbpedia.org/ontology/Project> .
<http://dbpedia.org/ontology/Song> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://dbpedia.org/ontology/MusicalWork> .
<http://dbpedia.org/ontology/NetballPlayer> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://dbpedia.org/ontology/Athlete> .
<http://dbpedia.org/ontology/Guitar> <http://www.w3.org/2000/01/rdf-schema#subClassOf> <http://dbpedia.org/ontology/Instrument> .
$ sparql -out RDF/XML --query query.rq --data dbpedia_3.9.owl | head -28
<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns="http://dbpedia.org/ontology/"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <rdf:Description rdf:about="http://dbpedia.org/ontology/SpeedwayTeam">
    <rdfs:subClassOf>
      <rdf:Description rdf:about="http://dbpedia.org/ontology/SportsTeam">
        <rdfs:subClassOf>
          <rdf:Description rdf:about="http://dbpedia.org/ontology/Organisation">
            <rdfs:subClassOf>
              <rdf:Description rdf:about="http://dbpedia.org/ontology/Agent">
                <rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
              </rdf:Description>
            </rdfs:subClassOf>
          </rdf:Description>
        </rdfs:subClassOf>
      </rdf:Description>
    </rdfs:subClassOf>
  </rdf:Description>
  <rdf:Description rdf:about="http://dbpedia.org/ontology/NoteworthyPartOfBuilding">
    <rdfs:subClassOf>
      <rdf:Description rdf:about="http://dbpedia.org/ontology/ArchitecturalStructure">
        <rdfs:subClassOf>
          <rdf:Description rdf:about="http://dbpedia.org/ontology/Place">
            <rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
          </rdf:Description>
  <!-- ... -->
person Joshua Taylor    schedule 19.10.2013
comment
Как го направихте програмно? :P - person Stefan Kunze; 20.10.2013
comment
@StefanKunze Как точно искате резултатите? Търсите ли да получите модел, съдържащ само тези тройки? Или начин за итерация през тях? Или нещо друго…? - person Joshua Taylor; 20.10.2013
comment
Бих искал да премина през този определен онтологичен файл, така че да обработвам само отношения на подкласове. - person Stefan Kunze; 20.10.2013
comment
@StefanKunze Добре, това не е твърде трудно да се използва, например Jena. В момента трябва да стартирам, но би трябвало да мога да публикувам примерен код след няколко часа. - person Joshua Taylor; 20.10.2013
comment
@StefanKunze Актуализирах отговора си, за да покажа как можете да направите това програмно с помощта на Jena. Има много RDF API и Jena е само един от тях. Повечето обаче ще ви позволят да направите нещо подобно; т.е.: заредете данните в модел, изберете тройки от определена форма от модела, направете нещо с тези тройки. - person Joshua Taylor; 21.10.2013