1

我正在尝试使用 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"] ].

4

2 回答 2

0

如果根据空白节点值进行过滤。这是我提出的最后一个问题。

            PREFIX rr: <http://www.w3.org/ns/r2rml#> 
            DELETE { ?om rr:language "dhhdhd" } 
            INSERT { ?om rr:language "en-fhfhfh" } 
            WHERE { 
            SELECT ?om
            WHERE {
                  ?om rr:language "dhhdhd" .
                  FILTER(str(?om) = "ub1bL24C24").
                }
            }
于 2020-10-17T10:59:24.620 回答
0

事实上,正如评论者@TallTed 所说,“不能在单独的查询中直接引用空白节点”。您正在尝试对未明确定义的 BN 做一些事情,即保持它们的绝对身份,例如跨单独的查询。您应该采用相对标识(参考已标识、URI、节点来定位 BN)或单个 SPARQL 查询的方法。所以这个问题是 RDF/SPARQL 问题,而不是 RDFlib 问题。

您说:“我无法组合查询,因为可能存在具有相同语言标签的其他对象映射”。因此,如果由于节点缺乏明确性而无法确定地引用节点,则必须更改数据,但我怀疑您可以 - 请参阅最后的建议。

然后你说“我已经找到了解决方案并相应地更新了问题。它真的是一个黑客......”是的,不要这样做!您应该有一个不依赖于 RDFlib 某些怪癖的解决方案!RDF 和语义网一般都是关于通用定义和标准的数据和查询,所以不要依赖特定的工具包来解决这样的数据问题。仅将 RDFlib 用作实现,但应该可以用另一种语言复制。我个人首先将我所有的 RDFlib 三重添加/删除/选择代码建模为标准 SPARQL 查询,这样我的 RDFlib 代码就只是一个等效的标准函数。

在您自己的回答中,您说“如果您根据空白节点值进行过滤......”,也不要这样做!

我的建议是更改您的基础数据以包括事物的表示 - 命名节点等 - 您可以用来修复查询。如果您无法在不借助 hack 的情况下区分要更改的内容,那么您就有一个需要解决的数据建模问题。我确实认为您可以区分对象图。

在您的数据中,您必须能够修复要更改语言的特定对象映射。每个列的对象映射是否唯一,并且该列是否由其rr:column值唯一标识?如果是这样:

SELECT ?lang
WHERE {
  ?om rr:column ?col .  ?om rr:language ?lang .
  FILTER (?col = "age")
}

这将为您提供“年龄”列的对象映射,因此,要更改它:

DELETE {
  ?om rr:language ?lang .
}
INSERT {
  ?om rr:language "new-language" .
}
WHERE {
  ?om rr:column ?col .  ?om rr:language ?lang .

  FILTER (?col = "age")
}
于 2020-10-25T05:27:35.880 回答