выполнение комплексного соединения на RDF - PullRequest
0 голосов
/ 05 июля 2011

Я хочу выполнить следующий запрос:

SELECT ?name1 ?name2 WHERE {
    ?article1 rdf:type bench:Article .
    ?article2 rdf:type bench:Article .
    ?article1 dc:creator ?author1 .
    ?author1 foaf:name ?name1 .
    ?article2 dc:creator ?author2 .
    ?author2 foaf:name ?name2 .
    ?article1 swrc:journal ?journal .
    ?article2 swrc:journal ?journal .
}

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

  1. Я будунайти все общие переменные объединения, например:? article1,? article2,? author1,? author2,? journal.
  2. Я выполню соединение, которое является частичным объединением, поэтому выходные данные будут создаваться на основе переменных общего объединения (Totalнет выходных файлов будет 5)
  3. Теперь я хочу выполнить операцию SELECT {SELECT? name1? name2} для этих 5 выходных файлов ..
  4. Готово

Теперь моя путаница в том, будет ли он производить идеальный вывод, как при обычном соединении или нет ???? ..

Ответы [ 2 ]

1 голос
/ 31 июля 2011

Я не совсем уверен, что вы пытаетесь сделать. Вы реализуете оценщик запросов SPARQL, и результаты неверны?

В любом случае, да, этот запрос может быть выполнен с помощью объединений. Я не знаю, что вы имеете в виду под частичным объединением. Все соединения здесь - это обычные равнины. Один действительный порядок соединения будет:

  1. объединить ?article1 rdf:type bench:Article с ?article1 dc:creator ?author1 (на? Article1)
  2. объединить результат с ?author1 foaf:name ?name1 (on? Author1)
  3. объединить результат с ?article1 swrc:journal ?journal (on? Article1)
  4. объединить результат с ?article2 swrc:journal ?journal (on? Journal)
  5. результат объединения с ?article2 rdf:type bench:Article (on? Article2)
  6. объединить результат с ?article2 dc:creator ?author2 (on? Article2)
  7. объединить результат с ?author2 foaf:name ?name2 (on? Author2)

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

Вы также можете увидеть, что другие тройные магазины делают с запросом. Например, в Сезаме после подготовки запроса вы можете проверить план запроса, вызвав SailQuery.getParsedQuery().getTupleExpr().

1 голос
/ 05 июля 2011

Полагаю, вам нужно что-то вроде ...

SELECT ?article ?name WHERE {
?article rdf:type bench:Article .
?article dc:creator ?author .
?author foaf:name ?name .
FILTER ( ?article = <ARTICLE_URI_1> || ?article = <ARTICLE_URI_2> || ...
... || ?article = <ARTICLE_URI_5>)
}

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

Кроме того, ваш запрос не использует "соединения" SPARQL, как ожидалось, у вас есть три отдельных блока изолированных шаблонов, которые могут привести к комбинаторному взрыву в зависимости от структуры ваших данных.

Редактировать: объединить анализ запроса в вопросе

Объединение этого запроса приведет к наиболее вероятным противоречивым результатам. Но наиболее оптимизированный способ - начать с самых строгих шаблонов. Таким образом, возможный подход может быть:

  1. Найдите ?article1 и ?article2, применив ?article1 rdf:type bench:Article . и ?article2 rdf:type bench:Article .

  2. Удалите все значения из article1 и ?article2, которые не совпадают ?journal. Это связано с паттернами ?article1 swrc:journal ?journal . и ?article2 swrc:journal ?journal .

  3. Замените значения ?article1 и ?article2 на ?article1 dc:creator ?author1 . и ?article2 dc:creator ?author2 соответственно, чтобы получить ?author1 и ?author2.

  4. Сделайте эквивалентный шаг, чтобы получить ?name1 ?name2.

  5. Делать декартово произведение выбранных переменных ?name1 ?name2, потому что они не объединены.

Суть в том, что ответ на ваш вопрос таков: Да, результат создается на основе объединения переменных. Который в большинстве случаев также выполняется путем подстановки значений в последующих шаблонах. Оптимизация, как правило, производится на основе наиболее строгих шаблонов и заменяется как можно скорее.

...