8

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

它必须具有 WHERE 规范,并且在单个查询中更新不止一个三元组。

谢谢。

编辑/示例:

这是我当前的代码,其目标是用INSERT 子句中指定的值替换dc:creator,dc:title的所有当前值。dc:description这个查询在逻辑和语法上是否正确?

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

4 回答 4

18

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

@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 . 
}
于 2013-10-22T11:56:54.057 回答
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'
  }
于 2013-10-21T19:09:09.407 回答
2

哈利路亚感谢上帝。

3 天后,我的头撞到了墙上,我相信我有解决方案,这就像一个变通方法。首先,您创建DELETE语句,然后使用分号指定要插入的三元组。它仍然是两个操作,但至少它们是由查询服务器控制的,即您不必执行两个单独的请求,一个用于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 .
}; 

<--------注意第一部分末尾的分号

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"  .
}
于 2013-10-21T19:55:33.930 回答
-3

sparql 插入是不可能的。sparql 处理已经映射和转储 rdf 文件。它是链接数据或图形数据的唯一查询处理。不是 mysql、sql 等数据库...

主客体谓词格式的 rdf 文件。

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

于 2016-02-11T10:26:03.803 回答