2015-09-08 5 views
1

Я хочу заменить сервер всех моих предметов, хранящихся в моем трехэтажном магазине в Йене.Замена домена в JENA Triplestore

Я пробовал этот способ, но сервер не будет заменен ...

DELETE { ?s ?p ?o } 
INSERT { ?s1 ?p ?o } 
WHERE { 
    { SELECT (uri(concat('http://localhost:8080/', SUBSTR(str(?s),22))) AS ?s1) 
     { 
      ?s ?p ?o . 
      FILTER regex(str(?s), '^https://somedomain.org/') 
     } 
    } 
} 

Когда я только выполнить следующий запрос

SELECT (uri(concat('http://localhost:8080/', SUBSTR(str(?s),22))) AS ?s1) ?s 
{ 
    ?s ?p ?o . 
    FILTER regex(str(?s), '^https://somedomain.org/') 
} 

'? S' и '? S1' делать имеют правильные значения.

Похоже, что в блоке DELETE/INSERT доступно значение '? S' и '? S1'. Что случилось с моим запросом обновления?

+0

Трудно сказать без полного, минимального примера. http://stackoverflow.com/help/mcve и включая (1), какую версию вы используете (2), какую систему хранения используете, и (3) данные. – AndyS

+0

Я не думаю, что это должно иметь какой-то эффект, но было бы намного проще использовать 'BIND (uri (concat (...)) как ...)' внутри 'where {...}' без использования вложенный подзапрос. –

ответ

1

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

Это означает, что вне подзапроса не видны ?s, ?p и ?o. Поэтому, когда шаблоны и INSERT пытаются создать троек для удаления и вставить все троек, которые они строят, являются недействительными (потому что не все переменные видны), и поэтому ничего не меняется.

Чтобы исправить это, вы должны либо проецировать все соответствующие переменные:

DELETE { ?s ?p ?o } 
INSERT { ?s1 ?p ?o } 
WHERE 
{ 
    { 
    SELECT ?s ?p ?o (uri(concat('http://localhost:8080/', SUBSTR(str(?s),22))) AS ?s1) 
    { 
     ?s ?p ?o . 
     FILTER regex(str(?s), '^https://somedomain.org/') 
    } 
    } 
} 

Или следовать Joshua Taylor's предложение от комментариев. Это на самом деле лучше, так как упрощает общий запрос:

DELETE { ?s ?p ?o } 
INSERT { ?s1 ?p ?o } 
WHERE 
{ 
    ?s ?p ?o . 
    FILTER regex(str(?s), '^https://somedomain.org/') 
    BIND(uri(concat('http://localhost:8080/', SUBSTR(str(?s),22))) AS ?s1) 
}