SPARQL UNION - набор результатов не завершен - PullRequest
1 голос
/ 05 мая 2010

У меня есть два запроса:

запрос 1:

SELECT DISTINCT ?o COUNT(?o)  
WHERE 
{ ?s1 ?somep1 <predicate_one-uri>. ?s1 ?p ?o}

запрос 2:

SELECT DISTINCT ?o COUNT(?o)  
WHERE 
{?s2 ?somep2 <predicate_two-uri>.?s2 ?p ?o.}

Каждый запрос дает мне другой набор результатов (как и ожидалось). Мне нужно объединить эти два набора, исходя из того, что, как я понимаю, приведенный ниже запрос должен дать мне набор, который я хочу:

SELECT DISTINCT ?o COUNT(?o)  
WHERE 
{
 { ?s1 ?somep1 <predicate_one-uri>.?s1 ?p1 ?o}
  UNION 
 {?s2 ?somep2 <predicate_two-uri>.?s2 ?p2 ?o.}
}

Проблема в том, что некоторые результаты из запроса 1 отсутствуют в наборе объединений и наоборот для запроса 2. Объединение не работает должным образом, поскольку оно не включает в себя все результаты запроса 1 и запроса 2. Пожалуйста, сообщите правильная структура запроса sparql для достижения желаемого набора результатов.

Хотя, если я сделаю следующий запрос (просто удалите функцию COUNT):

SELECT DISTINCT ?o
WHERE 
{
{ ?s1 ?somep1 <predicate_one-uri>.?s1 ?p ?o}
 UNION {?s2 ?somep2 <predicate_two-uri>.?s2 ?p ?o.}
}

Я получил соответствующий набор результатов. Но мне также нужно иметь частоту переменной ?o.

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

Я думаю, что это будет работать, если вы удалите DISTINCT и добавите GROUP BY ?o в конец запроса.

DISTINCT действительно только для удаления дубликатов.Это не для группировки и подсчета.

1 голос
/ 05 мая 2010

Не совсем уверен, но есть теория, которая может быть совершенно неверной

Ваш запрос меня немного смущает, поскольку он предполагает некоторую группировку, поскольку в теории хотя бы механизм SPARQL не должен позволять вам выбирать как переменную, так и агрегат для этой переменной в одном и том же запросе без явного указания GROUP BY. Таким образом, результаты могут зависеть от того, какой движок SPARQL / триплетное хранилище вы используете?

Если речь идет о неявной группировке, вы можете не получить столько результатов, сколько ожидаете, поскольку группировка объединит результаты с обеих сторон объединения. Например, запрос 1 дает 10 результатов, а запрос 2 - 5 результатов, тогда максимальное количество результатов, которое вы можете получить от объединения, составляет 15, но может быть меньше, поскольку группировка может объединять результаты с двух сторон объединения. Чтобы избежать этого, вы должны использовать совершенно разные имена переменных по обе стороны запроса, например:

SELECT * WHERE { {?s ?p ?o} UNION {?x ?y ?z}}

Что даст вам таблицу результатов, которая будет иметь следующий вид:

 ?s | ?p | ?o | ?x | ?y | ?z
-----------------------------
  a |  b |  c |    |    |
    |    |    |  a |  b |  c

Не уверен, что что-либо из этого актуально / полезно для вас, если вы можете предоставить более подробную информацию о среде, в которой вы выполняете запрос, например: Triplestore, механизм SPARQL, API / библиотека и т. Д., То я / кто-то другой сможет дать лучший ответ

...