Импорт иерархии классов 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
}

Используя инструмент командной строки Jena sparql, мы находим 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
Как ты сделал это программно? :П - 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. Существует множество API-интерфейсов RDF, и Jena — лишь один из них. Однако большинство позволит вам сделать что-то подобное; то есть: загрузить данные в модель, выбрать тройки определенной формы из модели, сделать что-то с этими тройками. - person Joshua Taylor; 21.10.2013