SPARQL更新示例,用于在单个查询中更新多个三元组

时间:2013-10-21 18:53:58

标签: sparql

任何人都可以在任何文档中指出我在SPARQL中的有效 UPDATE语句(无论是W3C,virtuoso,语义网页,还是您自己的自定义代码等?

必须完成WHERE规范,并且在一个查询中更新多个三元组。

感谢。

编辑/示例:

这是我当前的代码,其目标是将dc:creatordc:titledc:description的所有当前值替换为INSERT子句中指定的值。这个查询在逻辑和语法方面都是正确的吗?

WITH GRAPH  <http://127.0.0.1:3000/dendro_graph>  
DELETE 
{ 
  :teste  dc:creator      ?o0 .
  :teste  dc:title        ?o1 .
  :teste  dc:description  ?o2 .
}
INSERT 
{ 
  :teste  dc:creator      "Creator%201" .
  :teste  dc:creator      "Creator%202" .
  :teste  dc:title        "Title%201" .
  :teste  dc:description  "Description%201" .
} 
WHERE 
{ 
  :teste  dc:creator      ?o0 .
  :teste  dc:title        ?o1 .
  :teste  dc:description  ?o2 .
} 

4 个答案:

答案 0 :(得分:14)

我仍然不完全清楚你想要实现的目标,以及为什么你提供的示例更新不是你想要的,但如果目标是更新替换给定主题的三元组,你可以做这样的事情:

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
@prefix ex: <http://example.org/> 

DELETE {?s ?p ?o}
INSERT {?s ex:title "foo" ;
           ex:description "bar" ;
           rdf:type ex:FooBar .  
       }
WHERE  { ?s ?p ?o . 
         FILTER (?s = ex:subject1) 
}

上述操作将删除所有以ex:subject1为主题的现有三元组,并插入新标题,说明和类型。

或者,如果您不喜欢过滤器,您也可以像这样制定上述内容:

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
@prefix ex: <http://example.org/> 

DELETE {ex:subject1 ?p ?o}
INSERT {ex:subject1 ex:title "foo" ;
                    ex:description "bar" ;
                    rdf:type ex:FooBar .  
}
WHERE  { 
        ex:subject1 ?p ?o . 
}

如果您只想删除给定主题的特定属性(而不是具有该主题的所有三元组),您可以像这样修改操作:

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
@prefix ex: <http://example.org/> 

DELETE {ex:subject1 ex:title ?t ;
                    ex:description ?d ; 
                    rdf:type ?c . 
       }
INSERT {ex:subject1 ex:title "foo" ;
                    ex:description "bar" ;
                    rdf:type ex:FooBar .  
}
WHERE  { 
        ex:subject1 ex:title ?t ;
                    ex:description ?d ;
                    rdf:type ?c . 
}

答案 1 :(得分:5)

在SPARQL中,更新表示为DELETE,后跟INSERT:

http://www.w3.org/TR/2010/WD-sparql11-update-20100126/#t413

PREFIX foaf:  <http://xmlns.com/foaf/0.1/>

WITH <http://example/addresses>
DELETE { ?person foaf:firstName 'Bill' }
INSERT { ?person foaf:firstName 'William' }
WHERE
  { ?person a foaf:Person .
    ?person foaf:firstName 'Bill'
  }

答案 2 :(得分:2)

哈利路亚感谢上帝。

在墙上撞了3天后,我相信我有解决方案,就像一个解决方案。首先,您创建DELETE语句,然后使用分号指定要插入的三元组。它仍然是两个操作,但至少它们是由查询服务器控制的,i。即您不必执行两个单独的请求,一个用于DELETE其他UPDATE(非常危险)。

这是我的工作代码,现在(显然)已修复:

WITH GRAPH  <http://127.0.0.1:3000/dendro_graph>  
DELETE 
{ 
  :teste  dc:creator  ?o0 .
  :teste  dc:title    ?o1 .
} 
WHERE 
{ 
  :teste  dc:creator  ?o0 .
  :teste  dc:title    ?o1 .
}; 

&lt; ------注意第一部分末尾的SEMICOLON

INSERT DATA
{ 
  :teste   dc:creator   "criador%20do%20teste"  .
  :teste   dc:creator   "second%20criador%20do%20teste"  .
  :teste   dc:creator   "third%20criador%20do%20teste"  .
  :teste   dc:creator   "fourth%20criador%20do%20teste"  .
  :teste   dc:title     "t1"  .
  :teste   dc:title     "t3"  .
  :teste   dc:title     "second%20title"  .
}

答案 3 :(得分:-3)

sparql insert是不可能的。已经映射的sparql处理&amp; dump rdf文件。 它是链接数据或图形数据的唯一查询处理。不像mysql,sql等数据库...

主题对象谓词格式的rdf文件。

select *的sparql查询其中{?s?p?o。得到结果