【发布时间】:2021-01-30 20:06:35
【问题描述】:
我正在尝试使用 RDFlib 更新以空白节点为主题的三元组的对象。我首先在第一个函数中选择空白节点,然后将此空白节点插入到第二个函数的更新查询中,但是,这并没有为我提供所需的输出。我无法使用 add() 方法或 initBindings,因为我需要保存为用户执行的 SPARQL 查询。
样本数据
@prefix rr: <http://www.w3.org/ns/r2rml#> .
[ rr:objectMap [ rr:column "age" ;
rr:language "dhhdhd"] ].
代码
mapping_graph = Graph().parse("valid_mapping.ttl",format="ttl")
# find the blank node for the update query
def find_om_IRI():
query = """SELECT ?om
WHERE {
?om rr:language 'dhhdhd' .
}
"""
qres = mapping_graph.query(query)
for row in qres:
return row[0]
# insert blank node as subject to update query
def change_language_tag():
om_IRI = find_om_IRI()
update_query = """
PREFIX rr: <http://www.w3.org/ns/r2rml#>
DELETE DATA{
_:%s rr:language 'dhhdhd' .
}
""" % (om_IRI)
processUpdate(mapping_graph, update_query)
print(update_query)
print(mapping_graph.serialize(format="ttl").decode("utf-8"))
return update_query
change_language_tag()
然而,这会返回以下输出。保持图表不变。
@prefix rr: <http://www.w3.org/ns/r2rml#> .
[ rr:objectMap [ rr:column "age" ;
rr:language "dhhdhd"] ].
【问题讨论】:
-
查看blank-nodes标签信息。
-
为什么不合并两个查询?将
SELECT的内容放在WHERE部分的查询中,例如DELETE {?om rr:language 'dhhdhd'} WHERE { ?om rr:language 'dhhdhd' } -
不幸的是,我无法合并查询,因为可能存在具有相同语言标签的其他对象映射....不过感谢您的建议。
-
但是你怎么知道你用你的代码删除了哪一个?只是随机一个吗?如果是这样,您可以通过
DELETE {?om rr:language 'dhhdhd'} WHERE { SELECT ?om WHERE {?om rr:language 'dhhdhd' } LIMIT 1}只选择一个 -
我已经找到了解决方案并相应地更新了问题。它确实是一个 hack,但是,它确实有效。 RDFlib 中的空白节点在加载到 Graph() 类时被赋予唯一值。这些在查询时保持持久性,可用于引用值。
标签: sparql rdf rdflib turtle-rdf blank-nodes