我目前正在尝试使用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文件的一部分是:
我希望有人可以解释我正在犯的错误。
收到评论后更新了问题:[已解决]
我现在能够生成输出。从输出中删除的是:
(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']