Как связать переменную с запрашиваемым элементом в SPARQL - PullRequest
10 голосов
/ 19 ноября 2009

В этом простом запросе sparql я получаю список предметов, объект которых 42

SELECT ?v WHERE { ?v ?p 42 }

Если я добавлю? P в качестве переменной

SELECT ?v ?p WHERE { ?v ?p 42 }

Я получу две сущности в строке: субъект и предикат. Что если бы я хотел три объекта, включая 42? Что-то вроде:

SELECT ?v ?p ?m WHERE { ?v ?p (42 as m) }

Ответы [ 6 ]

11 голосов
/ 14 февраля 2016

Другой вариант - использовать BIND, например ::1001.

SELECT ?v ?p ?m
WHERE {
  BIND(42 AS ?m)
  ?v ?p ?m
}

Оператор BIND просто добавляет привязку для? M, которую затем можно выбрать для набора результатов.

8 голосов
/ 04 марта 2014

В SPARQL 1.1 вы можете использовать для этого ЗНАЧЕНИЯ . Вы бы написали

SELECT ?v ?p ?m WHERE {
  values ?m { 42 }
  ?v ?p ?m
}
8 голосов
/ 19 ноября 2009

Стандартный SPARQL 1.0 не позволяет этого. Однако для этого могут быть некоторые специфичные для реализации расширения.

В качестве обходного пути, если данные содержат тройку с 42 в качестве литерала объекта, вы можете сделать это, например. как это:

SELECT ?v ?p ?m { ?v ?p 42, ?m FILTER(?m=42)}

, что эквивалентно

 SELECT ?v ?p ?m WHERE { ?v ?p 42 . ?v ?p ?m FILTER(?m=42)}

, так как вы можете написать графовые шаблоны, использующие одну и ту же тему и предикаты с помощью записи списка запятых объектов, а ключевое слово WHERE необязательно.

Для эффективности вы хотите использовать базовые графовые шаблоны, чтобы уменьшить рабочую тройку до меньшего набора, и только затем применять выражения FILTER для дальнейшего сокращения результатов.

1 голос
/ 03 января 2017

Вы можете сделать это двумя способами, используя ключевое слово BINDINGS, а также FILTER

Использование привязок

SELECT ?v ?p ?m 
WHERE { ?v ?p ?m}
BINDINGS ?m {(42)}

Использование ФИЛЬТРА

SELECT ?v ?p ?m
WHERE {
?v ?p ?m
FILTER (?m = 42)
}
1 голос
/ 20 ноября 2009
select ?v ?p ?m where { ?v ?p ?m . FILTER( ?m = 42 ) }
0 голосов
/ 12 сентября 2011

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

Это полезный шаблон, который поможет вам работать с запросом в узком диапазоне, прежде чем вы сможете использовать его для всего набора данных:

SELECT ?v ?p ?m WHERE {
   { SELECT 42 as ?m WHERE { } }
   ?v ?p ?m .
}
...