SPARQL:用于删除默认图和命名图中的三元组的单个DELETE查询

问题描述 投票:1回答:1

我正在尝试针对定义的四边形生成DELETE查询:

// Example of dataset used for generation of SPARQL
const quads = [ 
  ['<1>','<2>','<3>'],        // Graph: DEFAULT
  ['<a>','<b>','<c>','<d>'],  // Graph: <d>
  ['<w>','<x>','<y>','<z>']   // Graph: <z>
]

我能够生成SELECT查询来确定是否存在指定的四边形:

# SUCCESS: TRUE
# Returns all specified quads that exist

SELECT ?s ?p ?o ?g
FROM DEFAULT 
FROM NAMED <d>
FROM NAMED <z>
{
  {
    ?s ?p ?o.
    VALUES (?s ?p ?o) {
      ( <1> <2> <3> )
    }
  }
  UNION
  {
    GRAPH ?g {?s ?p ?o.}
    VALUES (?s ?p ?o ?g) {
      ( <a> <b> <c> <d> )
      ( <w> <x> <y> <z> )
    }
  }
}

尝试在同一DEFAULT查询中同时指定DELETE图和任何命名图都会导致错误:

# SUCCESS: FALSE
# Executing query failed: Found FROM. Was expecting one of: DATA, WHERE or punctuation '{'.

DELETE
FROM DEFAULT 
FROM NAMED <d>
FROM NAMED <z>
{
  {
    ?s ?p ?o.
    VALUES (?s ?p ?o) {
      ( <1> <2> <3> )
    }
  }
  UNION
  {
    GRAPH ?g {?s ?p ?o.}
    VALUES (?s ?p ?o ?g) {
      ( <a> <b> <c> <d> )
      ( <w> <x> <y> <z> )
    }
  }
}

还有其他方法可以完成此操作吗?

答案不必类似于成功的SELECT查询。

sparql named-graphs
1个回答
1
投票

首先:FROM DEFAULT表示默认图不是标准的SPARQL功能,因此其行为将取决于您使用的三元组(并且许多SPARQL引擎只会给出语法错误)。其次:在DELETE / INSERT操作中,使用USING关键字而不是FROM指定命名图。最后:DELETE WHERE(没有指定作为DELETE子句的一部分的模式的简短格式)不允许您在GRAPH部分中使用WHERE。我将展示一种在没有它的情况下制定DELETE的方法,但是或者,您必须选择执行DELETE { ?s ?p ?o } WHERE ....等的长格式。

要从两个命名的图形中删除,您可以执行此操作(注意,我已经删除了NAMED位,并且删除了graph参数):

  DELETE
  USING <d>
  USING <z>
  {
    ?s ?p ?o.
    VALUES (?s ?p ?o) {
      ( <a> <b> <c> )
      ( <w> <x> <y> )
    }
  }

[就像我说的那样,DEFAULT关键字不是标准的SPARQL功能。如果您这样做,也许您的SPARQL引擎会理解它:

  DELETE
  USING DEFAULT
  USING <d>
  USING <z>
  {
    ?s ?p ?o.
    VALUES (?s ?p ?o) {
     ( <1> <2> <3> )
     ( <a> <b> <c> )
     ( <w> <x> <y> )
    }
  }

否则,您最好的选择可能是使用一系列更新,而不是尝试在一个大的删除中完成所有操作。

© www.soinside.com 2019 - 2024. All rights reserved.