1

使用 AllegroGraph 6.4.6

我正在尝试根据定义的四边形生成单个 SPARQL 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>
]

/* Example of triples being queried against

   S   P   O   G
  --- --- --- ---
  <1> <2> <3>
  <a> <b> <c> <d> 
  <w> <x> <y> <z>        If we delete <1> <2> <3>, we don't
  <1> <2> <3> <4>   <--  want to accidentally delete this quad   

*/

我能够生成一个 SELECT 查询来确定所有四边形的存在:

# Returns all specified quads that exist

SELECT ?s ?p ?o ?g
FROM DEFAULT 
FROM NAMED <d>
FROM NAMED <z>
WHERE {
  {
    ?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> )
    }
  }
}
  • 返回指定的所有四边形VALUES
  • <1> <2> <3> <4>不会被退回。

下一个查询是尝试创建 DELETE 查询,但有一些问题(注意选项 1选项 2注释):

# Should delete all quads specified in VALUES

DELETE { 
  GRAPH ?g {?s ?p ?o.} 
  ?sD ?pD ?oD. 
}
# USING DEFAULT     # Option 1
# USING NAMED <d>   # Option 2
# USING NAMED <z>   # Option 2
WHERE {
  {
    ?sD ?pD ?oD.
    VALUES (?sD ?pD ?oD) {
      ( <1> <2> <3> )
    }
  }
  UNION
  {
    GRAPH ?g {?s ?p ?o.}
    VALUES (?s ?p ?o ?g) {
      ( <a> <b> <c> <d> )
      ( <w> <x> <y> <z> )
    }
  }
}
  • 选项 1未注释时,将返回错误消息:

    Found DEFAULT. Was expecting one of: NAMED, Q_IRI_REF, QNAME, QNAME_NS.
    
  • 选项 2未注释时,仅删除指定的命名图三元组:

    DELETED:
    
     S   P   O   G
    --- --- --- ---
    <a> <b> <c> <d>
    <w> <x> <y> <z>
    
  • 评论选项 1选项 2后,每个三元组都会被删除,即使是<1> <2> <3> <4>我们没有尝试删除的三元组。

    DELETED:
    
     S   P   O   G
    --- --- --- ---
    <1> <2> <3>
    <a> <b> <c> <d>
    <w> <x> <y> <z>
    <1> <2> <3> <4>
    
4

1 回答 1

1

FROM DEFAULT表示默认图不是标准的 SPARQL 功能,因此它的行为将取决于您使用的三元存储(并且许多 SPARQL 引擎只会给出语法错误)。

要从两个命名图中删除,您可以这样做(请注意,我已经删除了该NAMED位,并删除了 graph 参数):

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

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

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

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

于 2019-10-30T21:32:44.077 回答