Проверить наличие или отсутствие нескольких ресурсов с помощью запроса SPARQL - PullRequest
4 голосов
/ 14 мая 2019

У меня есть несколько ресурсов, таких как A, B, C.

Я хочу знать, существуют ли эти ресурсы в моей базе данных или нет.

Вот пример запроса для одного из них:

ASK { <http://fkg.iust.ac.ir/resource/A> ?p  ?o }

Этот запрос возвращает true или false.

Лучше использовать один запрос, и мне нужно получить 2 столбца, resource & existing.

Вот мой пример ответа:

---------------------------------------------------
|        resource        |        existing        |
|========================|========================|
|           :A           |          true          |
|------------------------|------------------------|
|           :B           |          false         |
|------------------------|------------------------|
|           :C           |          true          |
---------------------------------------------------

Я знаю ASK и UNION, но как я могу собрать их вместе для этого образца?

1 Ответ

4 голосов
/ 15 мая 2019

Запрос:

PREFIX : <http://fkg.iust.ac.ir/resource/>

SELECT ?resource (EXISTS { ?resource ?p ?o } AS ?existing) {
    VALUES ?resource { :A :B :C }
}

Данные испытаний:

<http://fkg.iust.ac.ir/resource/A> a _:dummy.
<http://fkg.iust.ac.ir/resource/C> a _:dummy.

Результат:

-----------------------
| resource | existing |
=======================
| :A       | true     |
| :B       | false    |
| :C       | true     |
-----------------------
  1. Чтобы получить табличный результат, используйте SELECT вместо ASK
  2. Чтобы получить несколько решений для известного списка ресурсов, используйте VALUES
  3. EXISTS походит на мини-ASK запрос, который может быть встроен в выражения
  4. Используйте форму SELECT (expression AS ?variable), чтобы связать результат мини- ASK с переменной ?existing
  5. Предостережение: Ответ зависит от того, что вы подразумеваете под "ресурс существует". В графе RDF узлы не создаются и не удаляются явно, но они существуют просто благодаря тому, что используются в тройке. Оригинальный запрос ASK в письменном виде проверяет, существует ли какая-либо тройка, для которой в качестве субъекта используется узел. Для полноты можно также проверить положение объекта:
    (EXISTS { ?resource ?p ?o } || EXISTS { ?s ?p ?resource })
    
...