SPARQL Create Graph, если еще не существует - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь сформулировать запрос SPARQL, который создаст новый граф с идентификатором, если он еще не существует. Если он существует, запрос должен вернуть «Graph Exist».

Я использую RDF4J с запросами SPARQL.

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

CREATE GRAPH <http://www.example.com/ont#books>;
SELECT{
    ASK WHERE { GRAPH <http://www.example.com/ont#books> { ?s ?p ?o } }
    str("Graph exists!").

}

Он не принимает SELECT из-за CREATE GRAPH

1 Ответ

2 голосов
/ 09 октября 2019

Вы не можете комбинировать обновление и запрос таким способом. Разделенные точкой с запятой последовательности операций SPARQL могут только содержать операции обновления.

Кроме того, операция CREATE GRAPH сама по себе выдаст ошибку, если график уже существует. Просто выполните:

CREATE GRAPH <http://www.example.com/ont#books>

Если граф уже существует, операция выдаст ошибку.

Наконец: большинство реализаций базы данных RDF4J не записывают пустые графы. Это означает, что операция CREATE GRAPH по большей части является операцией без операции: она выдает ошибку, если граф, который вы пытаетесь создать, уже существует (то есть существуют операторы, использующие этот названный граф), ив противном случае он просто возвращает ОК и фактически ничего не делает.

Чтобы фактически создать именованный граф в RDF4J, вы должны добавить в него операторы, например:

 INSERT DATA { GRAPH <http://www.example.com/ont#books> { <ex:s1> <ex:p1> <ex:o1> } }

Если вы хотите проверить, что граф не существует, прежде чем вставить(чтобы он случайно не добавился к существующему графику), вы можете использовать последовательность обновления, например, так:

 CREATE GRAPH <http://www.example.com/ont#books> ;
 INSERT DATA { GRAPH <http://www.example.com/ont#books> { <ex:s1> <ex:p1> <ex:o1> } }

Если график уже существует, CREATE завершится ошибкой, а остальныепоследовательность будет прервана.

...