Sparql RDFlib空白节点更新查询

Sparql RDFlib空白节点更新查询,sparql,rdf,rdflib,turtle-rdf,blank-nodes,Sparql,Rdf,Rdflib,Turtle Rdf,Blank Nodes,我正在尝试使用RDFlib更新三元组的对象,其中一个空白节点作为其主题。首先,在第一个函数中选择空白节点,并将这个空白节点插入第二个函数中的更新查询中,但是,这并不能为我提供所需的输出。我不能使用add()方法或initBindings,因为我需要保存为用户执行的SPARQL查询 样本数据 @prefix rr: <http://www.w3.org/ns/r2rml#> . [ rr:objectMap [ rr:column "age" ;

我正在尝试使用RDFlib更新三元组的对象,其中一个空白节点作为其主题。首先,在第一个函数中选择空白节点,并将这个空白节点插入第二个函数中的更新查询中,但是,这并不能为我提供所需的输出。我不能使用add()方法或initBindings,因为我需要保存为用户执行的SPARQL查询

样本数据

@prefix rr: <http://www.w3.org/ns/r2rml#> .
[ rr:objectMap [ rr:column "age" ;
                 rr:language "dhhdhd"] ].
@前缀rr:。
[rr:objectMap[rr:列“年龄”;
rr:语言“dhhdhd”]]。
代码

mapping\u graph=graph().parse(“valid\u mapping.ttl”,format=“ttl”)
找到更新查询的空白节点
def find_om_IRI():
query=“”选择?om
在哪里{
?om rr:语言“dhhdhd”。
}
"""
qres=映射图.query(查询)
对于QRE中的行:
返回行[0]
#插入空白节点作为更新查询的主题
def change_language_tag():
om_IRI=查找om_IRI()
更新_query=“”
前缀rr:
删除数据{
_:%s rr:语言“dhhdhd”。
}
“%”(om_IRI)
processUpdate(映射图、更新查询)
打印(更新查询)
打印(映射\图形序列化(format=“ttl”).解码(“utf-8”))
返回更新查询
更改\u语言\u标记()
但是,这将返回以下输出。保持图形不变

@prefix rr: <http://www.w3.org/ns/r2rml#> .
[ rr:objectMap [ rr:column "age" ;
                 rr:language "dhhdhd"] ].

@前缀rr:。
[rr:objectMap[rr:列“年龄”;
rr:语言“dhhdhd”]]。

如果您根据空白节点值进行筛选,则 < P>。这是我提出的最后一个问题

            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").
                }
            }
前缀rr: 删除{?om rr:language“dhhdhd”} 插入{om rr:语言“en FH”} 何处{ 选择?om 在哪里{ ?om rr:语言“dhhdhd”。 过滤器(str(?om)=“ub1bL24C24”)。 } }
如果您根据空白节点值进行筛选,则 < P>。这是我提出的最后一个问题

            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").
                }
            }
前缀rr: 删除{?om rr:language“dhhdhd”} 插入{om rr:语言“en FH”} 何处{ 选择?om 在哪里{ ?om rr:语言“dhhdhd”。 过滤器(str(?om)=“ub1bL24C24”)。 } }
事实上,正如commenter@TallTed所说,“空白节点不能在单独的查询中直接引用”。您正试图对未明确定义的BN执行某些操作,即保持其绝对身份,例如跨单独的查询。您应该采用相对标识(参考已标识的、URI、节点定位BN)或单个SPARQL查询的方法。所以这个问题是RDF/SPARQL问题,而不是RDFlib问题

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


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

在你自己的答案中,你说:“如果你根据空白节点值过滤……”,也不要这样做!p> 我的建议是更改基础数据,使其包含可用于固定查询的对象(命名节点等)的表示。如果不借助黑客手段就无法区分想要更改的内容,那么就需要解决数据建模问题。我认为你可以分辨出物体贴图

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

SELECT ?lang
WHERE {
  ?om rr:column ?col .  ?om rr:language ?lang .
  FILTER (?col = "age")
}
这将获得列“age”的对象映射,因此,要更改它:

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

  FILTER (?col = "age")
}

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

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


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

在你自己的回答中,你说“如果你根据blan进行过滤