AllegroGraph SPARQL: УДАЛИТЬ из графов по умолчанию и именованных графов - PullRequest
1 голос
/ 30 октября 2019

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

*/

IЯ могу сгенерировать запрос 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, но имеет несколько проблем (обратите внимание на комментарии Option 1 и Option 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> )
    }
  }
}
  • С ONLY Опция 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>
    

1 Ответ

1 голос
/ 31 октября 2019

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

Toудалить из двух названных графиков, вы можете сделать это (обратите внимание, что я удалил бит 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> )
    }
  }

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

...