如何在 python 中使用 sparql、rdflib 询问本体

Posted

技术标签:

【中文标题】如何在 python 中使用 sparql、rdflib 询问本体【英文标题】:how to interrogate ontology with sparql, rdflib in python 【发布时间】:2016-12-12 17:01:14 【问题描述】:

我已经开发了自己的本体(我定义了我的类、属性等),我想用 sparql 询问我的本体。

在 protégé 2000(开源本体编辑器)中一切正常,但是当我想在 python 中实现我的请求 sparql 时遇到了一些问题。

我用 Java 完成了它,它工作了,但这不是我想要的,我想用pyjnius(一个 Python 模块,将 Java 类作为 Python 类访问)但也没有任何效果。

如何使用 sparql 来询问我的本体?有没有办法在 Python 中使用 jena?

这就是我用 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 来做,有人知道我该怎么做吗?!

【问题讨论】:

什么是“Protege 2000”?请添加更多信息,即 SPARQL 查询和 python 代码。什么是“一些问题”?你不能想象如果没有任何关于它的信息,没有人能真正帮助你。 @AKSW 对不起,我没有解释我的观点,我只是编辑了帖子,我向你展示了 java 代码,因为我不知道我是如何用 python 真正做到的,我试过但没有兄弟:(。 看看你的尝试会很有帮助......我已经使用 Kivy 框架工作了一点,目前正在编写一个 Python android 应用程序...... Pyjnius 来自 Kivy.org,适用于那些不知道。 @Mehdi 为什么不为 Python 使用 RDF/SPARQL 库呢?我建议使用 RDFLib:rdflib.readthedocs.io/en/stable @Jarvis 我无法安装它,我尝试了所有我发现出现此错误的解决方案:无法使用 cpu = 'i386' 分配 machine() = amdto cpu jnius 在 jnius.c “const_char”未声明的标识符中有问题。我在 win 8.1 64 bits python 2.7.10 64bits 上工作 【参考方案1】:

如果您想使用 Jena Fuseki,请查看此内容。 Jena TDB in 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 的资源并不多,所以如果您有任何与此相关的问题,请联系我,我很乐意探索它。

【讨论】:

谢谢你的回答,我尝试了你所做的,但它没有工作:(,我有这个错误:IOError:[Errno 2]没有这样的文件或目录:u'C:\ \Users\\Mehdi\\workspace\\My_work\\Test\\triples.nt'。我将其替换为:filename = 'JO Ontology modified 09 June 2014 with properties.owl' graph.load(filename, format='xml ') graph= graph.parse(filename, format='xml') 还有一个错误:+"?lois OntoJO:a_un_chemin ?y ."\ TypeError: bad operand type for unary +: 'str' graph =rdflib.Graph() filename = r'JO Ontology 于 2014 年 6 月 9 日修改为 properties.owl' graph.load(filename, format='xml') qres = graph.query( " " " SELECT * WHERE ?s ?p ?o limit 5 " " " ) for res in qres.result: print res 这是工作,这是为了确保我得到结果,但是当我想做一些 sparql 请求时,我有一些错误:( @Mehdi 您不必在查询中使用 where ,如果您不添加两个字符串,一元错误是您删除 + 。关于第二条评论,你说的 SPARQL 请求是什么意思,给我举个例子。 """ 前缀 OntoJO:owl-ontologies.com/Ontology1400008538.owl#> SELECT ?path WHERE ?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 运行它时,我什么也得不到。 检查python语法错误,比如查询后面的逗号,以增量方式运行查询,一组条件一个接一个,检查是否有效。

以上是关于如何在 python 中使用 sparql、rdflib 询问本体的主要内容,如果未能解决你的问题,请参考以下文章

其他RDF与SPARQL

其他RDF与SPARQL

java 处理rdf,sparql和语义Web的实用方法

在python中怎样将rdf转化为稀疏张量

知识工程基础-作业1

知识图谱学习与实践——通过例句介绍Sparql的使用