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

如何使用Python中的RDFLIB模块使用SparQL从OWL文件检索值?,python,sparql,owl,rdflib,Python,Sparql,Owl,Rdflib,我目前正在尝试用Python编写一个脚本,该脚本使用RDFLIB模块,以便使用SPARQL从OWL文件中检索特定值 我面临的问题是,当前版本的脚本不返回任何数据。我试图打印每一行,以便自己分析输出,但输出只是显示“进程已完成,退出代码为0” 我的最终目标是从OWL文件中检索一个值(在本例中,该值为'96')。此值链接到的对象在OWL文件中也链接到文件名: DTB OPR 170.769 - PR.H.STRAAT VH_gml.xml 我的目标是能够在使用文件名作为选择标准时打印值“96” 我

我目前正在尝试用Python编写一个脚本,该脚本使用
RDFLIB
模块,以便使用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
这是使用命令行打印的:

   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']

欢迎使用StackOverflow!请花一点时间(如果您还没有这样做)查看帮助部分,特别是和上的条目。在这种情况下:尝试缩小范围。如果这是您的第一个SPARQL查询,它太大和复杂了。请先执行一个非常基本的SPARQL查询(例如,
选择*WHERE{s?p?o}LIMIT 10
),以确保您可以返回结果。如果返回结果,您就知道问题出在原始查询中。逐步使查询变得更复杂,一步一步地进行,直到达到不再提供结果的程度。然后检查数据集,以了解上次添加的条件导致查询失败的原因。还有一个提示:不要发布代码示例(或数据示例)作为图像。相反,添加实际文本,以便人们可以复制粘贴它来为您测试。您显示的数据片段仅显示与
?pv
变量匹配的信息,用于
cbim:PropertyValue
实例。变量
?asfaltPlakCP
(以及连接到该变量的所有其他内容)在您的查询中需要您尚未向我们显示的其他数据。感谢您的回复@jeenbroekstra。我现在能够以
rdflib.term.literal(u'96.0')的形式生成输出…
如何根据查询结果中包含的两个选择条件打印单个值?我已经详细阐述了这个问题,并将其作为更新内容包含在我的原始帖子中。感谢您的帮助!欢迎使用StackOverflow!请稍等片刻(如果您尚未这样做)查看帮助部分,特别是和上的条目。在本例中:尝试缩小范围。如果这是您的第一个SPARQL查询,那么它太大太复杂了。请先执行一个非常基本的SPARQL查询(例如,
SELECT*WHERE{s?p?o}LIMIT 10
),以确保您可以返回结果。如果返回结果,您就知道问题出在原始查询中。逐步使查询变得更复杂,一步一步地进行,直到达到不再提供结果的程度。然后检查数据集,以了解上次添加的条件导致查询失败的原因。还有一个提示:不要发布代码示例(或数据示例)作为图像。相反,添加实际文本,以便人们可以复制粘贴它来为您测试。您显示的数据片段仅显示与
?pv
变量匹配的信息,用于
cbim:PropertyValue
实例。变量
?asfaltPlakCP
(以及连接到该变量的所有其他内容)在您的查询中需要您尚未向我们显示的其他数据。感谢您的回复@jeenbroekstra。我现在能够以
rdflib.term.literal(u'96.0')的形式生成输出…
如何根据查询结果中包含的两个选择条件打印单个值?我已经详细阐述了这个问题,并将其作为更新内容包含在我的原始帖子中。感谢您的帮助!
    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']