SPARQL - фильтр по разным объектам - PullRequest
0 голосов
/ 02 августа 2020

Я новичок в SPARQL, и у меня есть вопрос, как мне отфильтровать случаи, когда значение объекта отличается от набора значений, собранных из разных объектов? Я хочу использовать запрос как часть SPARQL-SHACL.

У меня нет проблем с доступом к значению, которое я хочу проверить, но тогда каким-то образом проверка выполняется для одного значения, а не для список / серия значений

пример:

  • моя переменная? значение 6
  • Я хочу проверить, не равно ли? значение, равное 6, какому-либо значений объекта? obj? obj имеют одиночные значения для разных троек (разные предметы), например 1 для одного случая, 2 для другого, 3 для другого, ...

Если я делаю ФИЛЬТР (? value! =? obj) Я получаю все случаи, когда 6! = 1 и так далее. Я хочу иметь возможность делать? value NOT IN (? obj), где? obj - это список 1, 2, 3, .. .. Я предполагаю, что в этом случае я получу только один результат, что 6 не найдено в списке.

Так может быть 2 вопроса

  • Можно ли построить список из? obj как часть запроса, чтобы я мог в конечном итоге использовать NOT IN?
  • Есть ли другой способ решить эту проблему?

Заранее спасибо .

1 Ответ

0 голосов
/ 02 августа 2020

Большое спасибо за ответ. Я сам нашел решение, но если будут доступны более эффективные решения, буду рад их узнать.

SELECT  $this ?value (COUNT(?type) AS ?types) ?typesall
        WHERE {
    {
    SELECT $this (COUNT(?typeall) AS ?typesall)
    WHERE {
        ?nscpointsa ex:class.assend  $this .
        ?nscpointsa rdf:type ?typeall .
      }
    GROUP BY $this ?typesall
    }
    $this $PATH ?value .
    OPTIONAL {$this ex:class2.control ?contr}.
    $this ex:class3.control1 ?control1 .
    ?nscpoints ex:class.assend  $this .
    ?nscpoints rdf:type ?type .
    ?nscpoints ex:class.attr1 ?attr1 .  
    FILTER (bound(?contr) && ?control1=true && ?value!=?attr1) .
        }
  GROUP BY $this ?value ?types ?typesall
  HAVING(?types=?typesall)
...