Есть ли хороший пример того, как использовать SPARQL для замены подстроки другой подстрокой в ​​коллекции троек? - PullRequest
0 голосов
/ 19 июня 2019

Я хочу отредактировать набор URI, заменив подстроку "iso-693" на "iso-639", используя запрос SPARQL. Я использую REPLACE, но, похоже, он ничего не делает.

У меня есть большая таксономия SKOS с URI, которые имеют неверную строку. У них должна быть эта строка: «iso-639», но я допустил ошибку при ее создании и поставил «iso-693». Я хотел бы исправить это. Я использовал запрос SPARQL, показанный ниже, который при запуске возвращает сообщение «обновление выполнено успешно», но данные троек фактически не меняются. Куда я иду не так?

INSERT
{
  ?s ?p ?o2
}

WHERE 
{ 
  ?s ?p ?o .
  FILTER (regex(str(?s), "iso-693") || regex(str(?o), "iso-693"))
  BIND(REPLACE(?o, "iso-693", "iso-639", "i") AS ?o2) .
  }

Я ожидал, что все вхождения подстроки изменятся на желаемое значение, но, похоже, ничего не изменилось, несмотря на сообщение об успехе.

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Если вы ориентируетесь на URI, вам нужно создать новые IRI с необходимой заменой и использовать их в части INSERT обновления вместе с исходными значениями ?s и ?o для части DELETE.REPLACE будет выдавать литералы, которые не соответствуют предметам.

Предложите использовать что-то вроде следующего:

DELETE {
    ?s ?p ?o
}
INSERT {
    ?newS ?p ?newO
} WHERE { 
    ?s ?p ?o .
    bind("iso-693" as ?match) .
    bind("iso-639" as ?replacement) .
    bind (regex(str(?s), ?match) as ?subjMatch) .
    bind (regex(str(?o), ?match) as ?objMatch) .
    filter (?subjMatch || ?objMatch)
    bind (if(?subjMatch, IRI(replace(str(?s), ?match, ?replacement)), ?s) as ?newS)
    bind (if(?objMatch, IRI(replace(str(?o), ?match, ?replacement)), ?o) as ?newO)
}
0 голосов
/ 20 июня 2019

Вам не хватает бита, который удаляет старое значение (INSERT просто добавляет новые тройки). Чтобы заменить тройку, вы должны DELETE старая тройка одновременно с INSERT новой, например:

DELETE
{
  ?s ?p ?o 
}
INSERT
{
  ?s ?p ?o2
}
WHERE 
{ 
  ?s ?p ?o .
  FILTER (regex(str(?s), "iso-693") || regex(str(?o), "iso-693"))
  BIND(REPLACE(?o, "iso-693", "iso-639", "i") AS ?o2) .
}
...