как опросить онтологию с помощью sparql, rdflib в python

Я разработал свою собственную онтологию (я определил свои классы, свойства и т. Д.), И я хочу опросить свою онтологию с помощью sparql.

в protégé 2000 (редактор онтологий с открытым исходным кодом) все работает нормально, но когда я хочу реализовать свой запрос sparql на python, я столкнулся с некоторыми проблемами.

Я сделал это на Java, и это сработало, но это не то, что я хочу, я хотел сделать это с pyjnius (модуль Python для доступа к классам Java как классам Python), но также ничего не работало.

Как я могу использовать sparql для исследования своей онтологии? Есть ли способ использовать jena в Python?

вот как я это сделал с java:

try{    

    Model model = ModelFactory.createDefaultModel();
    String FName = "C:\\Users\\p\\Desktop\\protégé project jour\\jour.owl";
    InputStream inStr = FileManager.get().open(FName);
    if (inStr == null) { throw new IllegalArgumentException("Fichier non trouvé");}
    // Lire le fichier RDF vers le modèle précédemment créé.
    model.read(inStr, "");

    //****************************


    String requete =
    //***=====This is the query that works good in the ontology with      properties between classes

    "PREFIX OntoJO:<http://www.owl-ontologies.com/Ontology1400008538.owl#>" +           
    "SELECT ?path " +
    "WHERE { "

    + " ?n OntoJO:signee_par '"+choixsignrech1.getText()+"' ." 
    + " ?s OntoJO:mot_cle '"+choixclrech1.getText()+"' ." 
    + " ?m OntoJO:secteur '"+choixsecrech1.getSelectedItem()+"' ."
    + " ?f OntoJO:ministere '"+choixminisrech1.getSelectedItem()+"' ."
    + " ?r OntoJO:synonymes '"+choixsyrech1.getText()+"' ."


    + "?n OntoJO:a_un_chemin ?y . "
    + "?s OntoJO:a_un_chemin ?y . "
    + "?m OntoJO:a_un_chemin ?y . "
    + "?f OntoJO:a_un_chemin ?y . "
    + "?r OntoJO:a_un_chemin ?y . "

    + "?y OntoJO:chemin ?path . }";



    Query query = QueryFactory.create(requete);
    QueryExecution qexec = QueryExecutionFactory.create(query, model);

    try {
        ResultSet results = qexec.execSelect();
        while (results.hasNext()){
            QuerySolution soln = results.nextSolution();
            RDFNode name = soln.get("path");
            System.out.println(name);
            javax.swing.JOptionPane.showMessageDialog(this,soln.get("path"));
        }
    } finally
    {
        qexec.close();
    } 

свойства: signee_par, mot_cle, secteur, ministere и т.д. (на французском), запрос sqarql основан на этих свойствах

Я хочу сделать это с помощью Python, кто-нибудь знает, как я могу ?!


person Mehdi    schedule 06.08.2016    source источник
comment
Что такое Protege 2000? И, пожалуйста, добавьте гораздо больше информации, например, запрос SPARQL и код Python. А что значит какие-то проблемы? Разве вы не представляете, что без какой-либо информации об этом вам никто особо не поможет.   -  person UninformedUser    schedule 06.08.2016
comment
@AKSW, извините, что не объяснил свою точку зрения, я только что отредактировал сообщение, я показал вам код Java, потому что я не знаю, как я на самом деле это делаю с python, я пробовал, но ничего, братан :(.   -  person Mehdi    schedule 06.08.2016
comment
Было бы полезно посмотреть, что вы пробовали ... Я немного поработал с фреймворком Kivy и сейчас пишу приложение Python для Android ... Pyjnius приходит с Kivy.org для тех, кто не знает.   -  person Jarvis    schedule 06.08.2016
comment
@Mehdi Тогда почему бы не использовать библиотеку RDF / SPARQL для Python? Я предлагаю RDFLib: rdflib.readthedocs.io/en/stable   -  person UninformedUser    schedule 06.08.2016
comment
@Jarvis, я не смог его установить, я пробую все решения, которые нашел, у меня есть эта ошибка: не удалось назначить machine () = amdto cpu, используя вместо этого cpu = 'i386', а для jnius есть проблема в jnius. c const_char undeclaredidentifier. Я работаю над Win 8.1, 64 бита, Python 2.7.10, 64 бита   -  person Mehdi    schedule 06.08.2016
comment
@AKSW да, я видел это, но я не знаю, как это работает на самом деле, так что я посмотрю и попробую еще раз. Я скажу тебе, сработает ли это. спасибо брат   -  person Mehdi    schedule 06.08.2016
comment
Я не работал с Python в Windows ... Я кое-что проверю, когда вернусь домой.   -  person Jarvis    schedule 06.08.2016


Ответы (1)


Посмотрите на это, если хотите использовать Jena Fuseki. Jena TDB в Python?

Могу предложить способ использования rdflib. Моя работа с rdflib ограничилась простыми запросами и сериализацией. Самый простой способ - загрузить ваш график (в любом из RDF-форматов nt, ttl и т. Д.). Запросить график и отформатировать результаты по мере необходимости.

import rdflib

graph = rdflib.Graph()
graph = graph.parse("triples.nt",format = "nt")
query =  "PREFIX OntoJO:<http://www.owl-ontologies.com /Ontology1400008538.owl#>" +\
"SELECT ?path " +\
"WHERE { "\
\
+ " ?n OntoJO:signee_par '"+choixsignrech1.getText()+"' ." \
+ " ?s OntoJO:mot_cle '"+choixclrech1.getText()+"' ." \
+ " ?m OntoJO:secteur '"+choixsecrech1.getSelectedItem()+"' ."\
+ " ?f OntoJO:ministere '"+choixminisrech1.getSelectedItem()+"' ."\
+ " ?r OntoJO:synonymes '"+choixsyrech1.getText()+"' ."\


+ "?n OntoJO:a_un_chemin ?y . "\
+ "?s OntoJO:a_un_chemin ?y . "\
+ "?m OntoJO:a_un_chemin ?y . "\
+ "?f OntoJO:a_un_chemin ?y . "\
+ "?r OntoJO:a_un_chemin ?y . "\
+ "?y OntoJO:chemin ?path . }"
result = graph.query(query)
#The result will be a QueryRow object because of the SELECT , look in the docs for further info.
for i in result:
     print i[0]

Я не позаботился о замене ваших вызовов getText, будьте осторожны. Приведенный выше код предназначен для python2 и должен распечатать все результаты запроса в данных triple.nt.

Прокомментируйте и дайте мне знать ваше мнение по поводу этих ответов. Существует не так много источников о rdflib, поэтому напишите мне, если у вас есть какие-либо вопросы, связанные с ним, и я буду рад изучить его.

person Abhishek P    schedule 07.08.2016
comment
спасибо за ваш ответ, я попробовал то, что вы сделали, и это не сработало :(, у меня такая ошибка: IOError: [Errno 2] Нет такого файла или каталога: u'C: \\ Users \\ Mehdi \\ workspace \\ My_work \\ Test \\ triples.nt '. Я заменяю его на: filename =' JO Ontology изменено 09 июня 2014 г. на properties.owl 'graph.load (filename, format =' xml ') graph = graph.parse ( filename, format = 'xml') также есть ошибка: +? lois OntoJO: a_un_chemin? y. \ TypeError: неверный тип операнда для унарного +: 'str' - person Mehdi; 08.08.2016
comment
graph = rdflib.Graph () filename = r'JO Онтология изменена 09 июня 2014 г. с помощью properties.owl 'graph.load (filename, format =' xml ') qres = graph.query (SELECT * WHERE {? s? p? o } limit 5) для res в qres.result: print res, это работа, это нужно, чтобы убедиться, что я верну результат, но когда я хочу выполнить какой-то запрос sparql, у меня есть некоторые ошибки :( - person Mehdi; 08.08.2016
comment
@Mehdi Вам не нужно использовать where в запросе, и унарная ошибка заключается в том, чтобы вы удалили +, если вы не добавляете две строки. А по поводу второго комментария, что вы подразумеваете под запросом SPARQL, приведите мне пример. - person Abhishek P; 08.08.2016
comment
ПРЕФИКС OntoJO: ‹owl-ontologies.com/Ontology1400008538.owl# ›ВЫБРАТЬ? путь ГДЕ {? lois OntoJO: ministere_lois? ministere_lois. ? lois OntoJO: a_un_chemin? y. ? y OntoJO: chemin? path},) lois это класс имени, ministere_lois это data_property и a_un_chemin это свойство объекта, я запускаю его с помощью java, он работает (конечно, не тот же синтаксис, но когда я запускаю его с python сейчас я ничего не получаю. - person Mehdi; 08.08.2016
comment
Проверьте наличие синтаксических ошибок Python, таких как запятая после запроса, выполните запросы поэтапно, один набор условий за другим, и проверьте, работает ли он. - person Abhishek P; 08.08.2016