AllegroGraph SPARQL: УДАЛИТЬ как из графика по умолчанию, так и из именованных графиков

Использование 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>
    

person Neil Graham    schedule 30.10.2019    source источник
comment
Какой у вас магазин квадроциклов (название и версия)? Это важно... Не в последнюю очередь потому, что DEFAULT существует не в каждом магазине, если вообще есть (хотя он есть в обсуждение возможного включения в SPARQL 1.2).   -  person TallTed    schedule 31.10.2019
comment
Я использую AllegroGraph 6.4.6.   -  person Neil Graham    schedule 31.10.2019
comment
Добавьте к запросу PREFIX franzOption_defaultDatasetBehavior: <franz:rdf> или PREFIX franzOption_defaultDatasetBehavior: <franz:default> и повторите эксперименты.   -  person Stanislav Kralin    schedule 31.10.2019


Ответы (1)


FROM DEFAULT, чтобы указать, что граф по умолчанию не является стандартной функцией SPARQL, поэтому его поведение будет зависеть от используемого хранилища триплетов (и многие механизмы SPARQL просто выдают синтаксическую ошибку).

Чтобы удалить из двух именованных графиков, вы можете сделать это (обратите внимание, что я удалил бит NAMED и удалил параметр графика):

  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> )
    }
  }

В противном случае лучше всего использовать последовательность обновлений, а не пытаться сделать все одним большим удалением.

person Jeen Broekstra    schedule 30.10.2019