2013-11-08 4 views
1

Я пытался запросить данные OWL с помощью RDFlib (SPARQL), но я не понял, почему это не работает. Я тестировал тот же запрос в Protege (запрос SPARQL), и он отлично работает! Это мой код:Почему мой запрос не работает с использованием RDFlib

import rdflib 
from rdflib import plugin 
from rdflib.graph import Graph 

g = Graph() 
g.parse("/localPath/a.owl") 

from rdflib.namespace import Namespace 
ns = Namespace("http://oaei.ontologymatching.org/2011/benchmarks/101/onto.rdf#") 

plugin.register(
    'sparql', rdflib.query.Processor, 
    'rdfextras.sparql.processor', 'Processor') 
plugin.register(
    'sparql', rdflib.query.Result, 
    'rdfextras.sparql.query', 'SPARQLQueryResult') 
# 
qres = g.query(
       """ 
        SELECT DISTINCT ?varClass ?varSubClass ?varSubClassComment ?varProperty ?varPropComment 
         WHERE { 
           { 
            ?varClass rdf:type owl:Class . 
            ?varProperty rdf:type owl:ObjectProperty ; rdfs:domain ?varClass . OPTIONAL{?varProperty rdfs:comment ?varPropComment} . 
            OPTIONAL{?varSubClass rdfs:subClassOf ?varClass ; rdfs:comment ?varSubClassComment} . 
         } 
        UNION 
         { 
            ?varClass rdf:type owl:Class . 
            ?varProperty rdf:type owl:DatatypeProperty ; rdfs:domain ?varClass . OPTIONAL{?varProperty rdfs:comment ?varPropComment}. 
         } 
          } 
       """ 
       , initNs=dict(
           ns=Namespace("http://oaei.ontologymatching.org/2011/benchmarks/101/onto.rdf#") 
          ) 
       ) 

for row in qres.result: 
    #print ("%s %s %s %s %s" % row) # %s represent the fields selected in the query 
    print row 

print (len(qres.result)) 

Мой результат ничего. Нет ошибки, но длина файла результата равна 0. Что я делаю неправильно? Кто-нибудь может мне помочь?

+0

Что такое содержимое '/localPath/a.owl?'? Трудно диагностировать, почему вы не получаете никаких результатов, если мы не можем видеть данные, к которым вы обращаетесь. –

+0

Какую версию rdflib вы используете? Я не из Pythonista, но я только что установил версию 4.0.1 и версию 0.4 rdfextras, и когда я запускаю ваш код (меняя путь к «a.owl», с «a.owl», который вы предоставили в текущем каталоге), я получаю массу результатов –

+0

Спасибо Joshua! Да, проблема не в данных, а в rdflib и rdfextras устарела! Оба пакета были причиной ошибки. Я использовал python из Canopy (rdflib v3.0.1-1 и rdfextras 0.1-1). Я обновил оба пакета во встроенном python на mac osx и протестировал один и тот же код. Теперь это работает. – Marcelo

ответ

1

Когда я запускаю этот запрос (с приставками определенных) в sparql.org's query processor, я получаю кучу результатов:

PREFIX ns: <http://oaei.ontologymatching.org/2011/benchmarks/101/onto.rdf#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT DISTINCT ?varClass ?varSubClass ?varSubClassComment ?varProperty ?varPropComment 
FROM <http://oaei.ontologymatching.org/2011/benchmarks/101/onto.rdf> 
WHERE { 
    { 
    ?varClass rdf:type owl:Class . 
    ?varProperty rdf:type owl:ObjectProperty ; rdfs:domain ?varClass . OPTIONAL{?varProperty rdfs:comment ?varPropComment} . 
    OPTIONAL{?varSubClass rdfs:subClassOf ?varClass ; rdfs:comment ?varSubClassComment} . 
    } 
    UNION 
    { 
    ?varClass rdf:type owl:Class . 
    ?varProperty rdf:type owl:DatatypeProperty ; rdfs:domain ?varClass . OPTIONAL{?varProperty rdfs:comment ?varPropComment}. 
    } 
} 

Я бы отметить, что вы можете значительно упростить этот запрос с значениями, так как вы «используете union просто указать owl:ObjectProperty и owl:DatatypeProperty:

PREFIX ns: <http://oaei.ontologymatching.org/2011/benchmarks/101/onto.rdf#> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 

SELECT DISTINCT ?varClass ?varSubClass ?varSubClassComment ?varProperty ?varPropComment 
FROM <http://oaei.ontologymatching.org/2011/benchmarks/101/onto.rdf> 
WHERE { 
    VALUES ?propertyType { owl:ObjectProperty owl:DatatypeProperty } 

    ?varClass rdf:type owl:Class . 
    ?varProperty rdf:type ?propertyType ; 
       rdfs:domain ?varClass . 
    OPTIONAL{ ?varProperty rdfs:comment ?varPropComment } 
    OPTIONAL{ ?varSubClass rdfs:subClassOf ?varClass ; 
         rdfs:comment ?varSubClassComment } 
} 

Я не вижу никаких причин, которые вам должны быть определены любые префиксы для http://oaei.ontologymatching.org/2011/benchmarks/101/onto.rdf в вашем запросе, так как вы не используете такое пространство имен в своем запросе. Я предполагаю, что это набор данных, который вы пытаетесь запросить, или, возможно, вы ожидаете, что результаты начнутся с этого префикса (поэтому, возможно, определение пространства имен делает их печатный результат более приятным).

Это настоятельно указывает на то, что проблема заключается в том, что на самом деле запрос, от /localPath/a.owl, не такой, как этот набор данных, или что вы используете некоторые устаревшие версии RDFlib, rdfextras или и то, и другое. Я смог локально запустить ваш код Python с помощью RDFlib версии 4.0.1 и rdfextras 0.4.

+0

Спасибо Joshua, я все еще изучаю sparql, и я делаю много ошибок. Как я уже упоминал, если я запускаю тот же запрос в sparql protige, он дает результат, который я ожидаю. Есть ли у вас какая-либо подсказка, почему она дает ошибку, когда я запускаю RDFlib в Python? Файл a.owl - это локальный файл, и я не знаю, как это сделать. – Marcelo

+0

Вы сказали в своем вопросе, что «Нет ошибки». Тот факт, что ваш запрос возвращает результаты Protégé и признан действительным sparql.org, указывает на то, что это не проблема с вашим запросом, а с данными, с которыми выполняется ваш запрос. Поскольку я просил разъяснений в комментарии по основному вопросу, ** какие данные вы используете против этого. I.e., что такое содержимое /localPath/a.owl'**? –

+0

Это ссылка на файл a.owl (https://www.dropbox.com/sh/cwlxa0o1tcbmfta/2coOveRXYK). Может быть, мой код грязный, но я хочу, чтобы из этого файла были все классы и свойства с соответствующими метками и комментариями. Вот что я пытаюсь закодировать. – Marcelo