【问题标题】:How do I execute a SPARQL update on a Sesame RDF repository from PHP?如何从 PHP 对 Sesame RDF 存储库执行 SPARQL 更新?
【发布时间】:2014-03-09 16:36:36
【问题描述】:

您好,我在用 php 语言插入数据时遇到问题。我正在使用库 sparqllib.php 来连接并在 php 中使用 sparql。我想插入一些东西。我正在尝试这个:

sparql_ns( "dc","http://purl.org/dc/elements/1.1/" );   
    $sparql = "INSERT DATA{ <http://example/authorsID>  
              dc:written    '".$paper."' ;
              dc:label  '".$paper."'.}";
    $result = sparql_query( $sparql ); 
    if( !$result ) { print sparql_errno() . ": " . sparql_error(). "\n"; exit; }
    else {
        print_r ($result);
    }

但它不起作用......它给了我这个输出:

400: Bad response, 400: MALFORMED QUERY: 在第 2 行第 1 列遇到 ""insert" "INSERT ""。 期待其中之一: “根据” ... “字首” ... “选择” ... “构造”... “描述” ... “问”...

当我在存储库中使用此 SPARQL 时 - SPARQL 更新:

PREFIX dc: <http://purl.org/dc/elements/1.1/>
INSERT DATA
{ <http://example/authorsID>    dc:written    "paperID" ;
                        dc:label  "A.N.Other" .
}

然后它可以工作...我不知道如何解决它...有什么想法吗?我想插入三重格式:name-haswritten-paper...

【问题讨论】:

标签: php insert sparql sesame


【解决方案1】:

您用于连接到 Sesame 的库错误地假定用于查询的 SPARQL 端点与用于更新的端点相同。不是这种情况。在 Sesame Server 中,query 端点是:

http://<host>:<port>/openrdf-sesame/repositories/<repositoryId>

但是 update 端点是:

http://<host>:<port>/openrdf-sesame/repositories/<repositoryId>/statements

您需要了解是否可以在该库中设置单独的更新端点 URL。如果没有,也可能表明您尝试使用的 PHP 库根本不是最新的:它可能不支持 SPARQL 更新。在这种情况下,请联系其开发人员,或切换到其他 PHP 库。

编辑您当然也可以完全“手动”执行 SPARQL 更新(因此不使用任何 PHP RDF 库),只需执行直接 HTTP POST 操作。作为参考,请参阅 Sesame HTTP protocol documentation,特别是 section on updating statements,但大致而言,您需要做的是:

  1. 打开到 http://&lt;host&gt;:&lt;port&gt;/openrdf-sesame/repositories/&lt;repositoryId&gt;/statements 的 HTTP 连接并创建一个新的 POST 请求。
  2. Content-Type 标头设置为application/x-www-form-urlencoded
  3. 将参数update 添加到请求正文中,并将(表单编码的)SPARQL 更新字符串作为其值。
  4. 触发 POST 请求。

如果更新正常执行,您将收到HTTP 204 NO CONTENT 响应。

【讨论】:

  • 但是如果我想用这个库做 SELECT - 一切都很完美......所以......也许这个库不知道 INSERT??
  • 我试过你的方法 $sparql = sparql_get( "localhost:8080/openrdf-sesame/repositories/bp/statements", " PREFIX foaf: xmlns.com/foaf/0.1> INSERT DATA{ example/authorsID> foaf:written '".$nazov." ' ; foaf:label ".$nazov.".} " );现在它的新错误... 406:错误响应,406:找不到可接受的文件格式。
  • @miroyeah。是的,所以,正如我在答案中所说,它可能不支持 SPARQL 更新。
  • 太棒了...所以,您有什么想法可以将这些数据从 php 插入到 rdf 存储库吗?任何可以插入的库?或任何其他可能性?
  • 这对于 SO 来说确实是题外话,但正如您在对上一个问题的评论中所说的那样,我建议您看一下 EasyRDF,它从表面上看更成熟和维护良好。
猜你喜欢
  • 1970-01-01
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多