2016-04-08 3 views
2

У меня есть реализация списка Ordered List Ontology, и я хочу написать запрос SPARQL для вставки в определенную позицию в список. Моя идея состоит в том, что это процесс с двумя шагами. Учитывая мой список 0 на основе, и я хочу, чтобы вставить в положении N:Вставить в позицию в упорядоченном списке Ontology

  1. Изменить индекс элементов с индексом > = N к индекс +1
  2. Вставьте новый слот к положение N

я борюсь с обновлением, которое следует повторно индексировать слоты. Я пытаюсь:

DELETE { 
    <http://listTest> <http://purl.org/ontology/olo/core#slot> ?slot . 
    ?slot a <http://purl.org/ontology/olo/core#Slot> . 
    ?slot <http://purl.org/ontology/olo/core#index> ?index . 
    ?slot <http://purl.org/ontology/olo/core#item> ?item 
} 
INSERT { 
    <http://listTest> <http://purl.org/ontology/olo/core#slot> ?slot . 
    ?slot a <http://purl.org/ontology/olo/core#Slot> . 
    ?slot <http://purl.org/ontology/olo/core#index> ?newIndex . 
    ?slot <http://purl.org/ontology/olo/core#item> ?item 
} 
WHERE { 
    FILTER(?index >= TARGET_INDEX) # Here would be the numeric value of target index 
    BIND((?index + 1) AS ?newIndex) 
} 

Несмотря на то, что запрос выполняется до конца, индексы слотов не обновляются. Любые предложения о том, что я делаю неправильно, будут высоко оценены.

ПРИМЕЧАНИЕ: В Слоты пустые узлы, не уверен, является ли это важно, но только, чтобы убедиться, что у вас есть все детали.

ответ

2

Ваш WHERE не имеет тройных паттернов, поэтому он не создает никаких привязок, поэтому для INSERT и DELETE ничего не нужно делать. Часть WHERE должна найти привязки для элемента, индекса и т. Д. Для только части индекса вам нужно выбрать все слоты, которым нужен обновленный индекс, и их новый индекс, и вы делаете это с частью WHERE. Затем вы удаляете одну тройку со старым индексом и вставляете одну тройку с новым индексом. Обратите внимание, что вам даже не нужно выбирать значение «item», только слот и индекс. Это будет выглядеть так:

DELETE { 
    ?slot <http://purl.org/ontology/olo/core#index> ?index . 
} 
INSERT { 
    ?slot <http://purl.org/ontology/olo/core#index> ?newIndex . 
} 
WHERE { 
    <http://listTest> <http://purl.org/ontology/olo/core#slot> ?slot . 
    ?slot a <http://purl.org/ontology/olo/core#Slot> . 
    ?slot <http://purl.org/ontology/olo/core#index> ?index . 
    FILTER(?index >= TARGET_INDEX) # Here would be the numeric value of target index 
    BIND((?index + 1) AS ?newIndex) 
} 
+0

Да, действительно. Я пришел к точно такому же выводу. большое спасибо –