如何使用Python中的RDFLIB模块使用SparQL从OWL文件中检索值?

时间:2016-02-01 07:21:41

标签: python sparql owl rdflib

我目前正在尝试使用RDFLIB模块在​​Python中编写脚本,以便使用SPARQL从OWL文件中检索特定值。

我遇到的问题是我的脚本的当前版本没有返回任何数据。我试图打印每一行以便自己输出输出,但输出只是显示“处理完成后退出代码0”。

我的最终目标是从OWL文件中检索一个值(在该示例中,该值将为'96')。此值链接到的对象也在OWL文件中链接到文件名:

DTB OPR 170.769 - PR.H.STRAAT VH_gml.xml

我的目标是在使用文件名作为选择标准时能够打印值'96'。

我在Python中的脚本的当前版本是:

    import rdflib
    from rdflib import Namespace


    g=rdflib.Graph()
    filename = r'bim\Perceel4.owl'
    g.load(filename, format='xml')


    qres = g.query(
        """SELECT DISTINCT ?value ?otl ?file ?frag
           WHERE {
              ?pv a cbim:PropertyValue .
              ?pv cbim:propertyType <http://bim.rws.nl/OTL/COINS/otl-otl.11.owl#OB02859-PR00501.0> .
              ?pv cbim:value ?value .
              ?asfaltplakCP cbim:PropertyValue ?pv .
              ?asfaltplakCP cbim:name ?name .
              ?asfaltplak cbim:contains[cbim:cataloguePart ?asfaltplakCP].
              optional {
                ?asfaltplak cbim:shape ?rep.
                ?rep cbim:documentAliasFilePath ?file .
                ?rep cbim:documentFragment ?frag }
          Filter (?file="DTB OPR 170.769 - PR.H.STRAAT VH_gml.xml").
           }""",
         initNs=dict(
            cbim=Namespace("http://www.coinsweb.nl/cbim-1.1.owl#")))

    for row in qres.result:
        print row

可以找到值“96”的OWL文件的一部分是:

Link to OWL file cut out

我希望有人可以解释我正在犯的错误。

收到评论后更新了问题:[已解决]

我现在能够生成输出。从输出中删除的是:

    (rdflib.term.Literal(u'96.0', datatype=rdflib.term.URIRef(u'http://www.w3.org/2001/XMLSchema#float')), rdflib.term.Literal(u'Asfaltplak_tussenlaag', datatype=rdflib.term.URIRef(u'http://www.w3.org/2001/XMLSchema#string')), rdflib.term.Literal(u'DTB PST 167.134 - 167.274 VH_gml.xml', datatype=rdflib.term.URIRef(u'http://www.w3.org/2001/XMLSchema#string')))
    (rdflib.term.Literal(u'94.0', datatype=rdflib.term.URIRef(u'http://www.w3.org/2001/XMLSchema#float')), rdflib.term.Literal(u'Asfaltplak_onderlaag', datatype=rdflib.term.URIRef(u'http://www.w3.org/2001/XMLSchema#string')), rdflib.term.Literal(u'DTB VBS 166.963 - 166.875 VH_gml.xml', datatype=rdflib.term.URIRef(u'http://www.w3.org/2001/XMLSchema#string')))

使用命令行打印:

   for row in qres:
       print row

我可以使用哪些命令行仅根据选择条件“文件名”和名称“Asfaltplak_Onderlaag”打印值(例如'96 .0')?

例如标准:

'DTB VBS 166.963 - 166.875 VH_gml.xml'和'Asfaltplak_Onderlaag'

结果为:94.0(使用

     print row['value']

我没有在SparQL查询中包含选择标准,因为我希望能够让python脚本在开发此脚本的后期阶段让用户了解这两个标准。

编辑:我已经能够解决这个问题的最后一部分了。我感谢你的帮助。

我正在寻找的最后一段代码是:

    for row in qres:
      if (rdflib.term.Literal(Layer, datatype=rdflib.term.URIRef(u'http://www.w3.org/2001/XMLSchema#string')) in row) and (rdflib.term.Literal(Road_Section, datatype=rdflib.term.URIRef(u'http://www.w3.org/2001/XMLSchema#string')) in row):
          obtained_value = row['value']

0 个答案:

没有答案