Сравнивать модели на идентичность, но с переменными? Построить с минусом?

Моя команда внедряет вариант отслеживания референтов Ceusters. В нашей реализации исходный URI объекта может быть изменен (на нечто, содержащее UUID), хотя ссылка на исходный URI всегда сохраняется.

Например:

:Joey rdf:type :person .
:New_York_City  rdf:type :locality .
:Joey :hometown :New_York_City .

может стать:

:Joey :replacedWith :ABC123 .
:ABC123 rdf:type :person .
:New_York_City  :replacedWith :FFF555 .
:FFF555  rdf:type :locality .
:ABC123 :hometown :FFF555 .

Я пишу несколько интеграционных тестов Scala, чтобы проверить, правильно ли наше программное обеспечение отслеживает референты.

В частности, я знаю, что должен ожидать этого CorrectPattern:

:Joey :replacedWith ?person .
?person rdf:type :person .
:New_York_City  :replacedWith ?locale .
?locale  rdf:type :locality .
?person :hometown ?locale .

Но я не знаю, какими будут значения ?person и ?locale.

Я могу SPARQL ASK за CorrectPattern... это скажет мне, присутствует ли шаблон. Но я также хочу подтвердить, что больше ничего не было добавлено.

Я думал, что смогу CONSTRUCT { ?s ?p ?o }, MINUS из CorrectPattern и проверить пустой результат, но Blazegraph говорит:

java.util.concurrent.ExecutionException: org.openrdf.query.MalformedQueryException: CONSTRUCT WHERE разрешает только шаблоны инструкций в предложении WHERE.

Любые идеи? Я хочу проверить, что весь тройной магазин содержит не больше и не меньше, чем CorrectPattern, но я думаю, что CorrectPattern должен содержать переменные.


person Mark Miller    schedule 23.06.2017    source источник
comment
Вы должны обернуть его в предложение SELECT, чтобы использовать расширенные функции.   -  person UninformedUser    schedule 23.06.2017
comment
@AKSW ... как вы думаете, я должен иметь возможность сделать аналогичный обернутый select, если я хочу вставить данные, содержащие функцию SPARQL, например now()? Я не могу заставить работать оператор insert data, содержащий bind(now() as ?insertDate).   -  person Mark Miller    schedule 26.06.2017
comment
Например, stackoverflow.com/questions/41575837/   -  person Mark Miller    schedule 26.06.2017


Ответы (2)


В очередной раз выручил комментарий от @AKSW, который, кажется, не особенно одержим зарабатыванием очков репутации.

Этот CONSTRUCT со встроенным SELECT получает все тройки из моей модели, лишенные любых троек в блоке MINUS, даже если они содержат переменные. Я почти уверен, что смогу конкретизировать блок MINUS и завершить свою задачу.

PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
CONSTRUCT 
  { 
    ?s ?p ?o .
  }
WHERE
  { SELECT  ?s ?p ?o
    WHERE
      { { ?s  ?p  ?o }
        MINUS
          { ?s  rdf:type  ?o }
      }
  }
person Mark Miller    schedule 23.06.2017

Чтобы определить, что хранилище троек содержит только те тройки, которые вы ожидаете, и ничего больше, вы можете проверить наличие точных троек, которые вы ожидаете, одновременно подсчитывая количество троек, которые появляются в базе данных до и после запуска вашей программы. Если разница в тройках выше или ниже, чем вы ожидаете, вы будете знать, что у вас есть какие-то посторонние или отсутствующие данные.

Используйте функцию SPARQL SELECT Подсчет:

SELECT (count(?triples) as ?count)
WHERE {
?triples ?p ?o .}

Псевдокод:

val beforeTripleCount = countTriplesInDatabase()
//run your program, test for expected triples
val afterTripleCount = countTriplesInDatabase()
val diff = afterTripleCount - beforeTripleCount
//diff should be equal to the number of triples you expect to be added/removed

Кроме того, если вы не хотите использовать переменные в своих тестах, вы можете написать дополнительные запросы для захвата URI созданного вами узла, а затем добавить результаты в свои тестовые запросы, используя конкатенацию строк.

person hayfreed    schedule 23.06.2017