Сопоставление наборов атрибутов с использованием SPARQL - PullRequest
0 голосов
/ 19 октября 2018

Этот вопрос касается поиска совпадений candidate и path с использованием тройного хранилища с конечной точкой SPARQL (Fuseki 3.8.0).

Критерии соответствия: attribute для candidate должен содержать все requires из path.В приведенных ниже минимальных данных примера соответствия должны быть candi_1 с path_1 и candi_2 с path_2.

@prefix : <http://example.com/app#> .

:candi_1
  a :candidate ;
  :attribute "A", "B", "C" .

:candi_2
  a :candidate ;
  :attribute "C", "D" .

:candi_3
  a :candidate ;
  :attribute "C", "E" .

:path_1
  a :path ;
  :requires "A", "C" .

:path_2
  a :path ;
  :requires "C", "D" .

Результат должен быть:

+------------+-------------+
| ?candidate | ?valid_path |
+------------+-------------+
| :candi1    | :path1      |
| :candi2    | :path2      |
+------------+-------------+

1 Ответ

0 голосов
/ 20 октября 2018

Вид двойного отрицания:

PREFIX : <http://example.com/app#> 

SELECT ?cand ?path
WHERE {
  ?cand a :candidate . 
  ?path a :path . 
  FILTER NOT EXISTS {
    ?path :requires ?attr .
    FILTER NOT EXISTS {
      ?cand :attribute ?attr .
    }
  }
}

Приведенный выше запрос не должен быть очень производительным.Попробуйте также следующее:

PREFIX : <http://example.com/app#> 

SELECT ?cand ?path
{
    {
    SELECT (COUNT(?attr) AS ?count) ?path ?cand
        {
        ?path a :path ; :requires ?attr .
        ?cand a :candidate ; :attribute ?attr . 
        } GROUP BY ?path ?cand
    } 
    {
    SELECT (COUNT(?attr) AS ?count) ?path
        {
        ?path a :path ; :requires ?attr .
        } GROUP BY ?path
    }
}

Однако последний запрос не должен работать, если существуют «пустые» кандидаты и пути.

...