2016-11-02 6 views
1

Я прошел через этот link, который использует EXPLAIN(), чтобы показать нам SQL-запрос, который Virtuoso генерирует (использует внутренне) для входного запроса SPARQL. Я попробовал это на своей версии Virtuoso 7.x и обнаружил, что получаю отличный результат. Я не могу полностью понять выход. Можно ли объяснить, что означает этот вывод из iSQL и как я буду интерпретировать SQL-запрос из этого?Virtuoso SQL-запрос запроса SPARQL в iSQL

Запрос SPARQL является

SPARQL SELECT DISTINCT ?s FROM <http://dbpedia.org> WHERE { 
?s a <http://dbpedia.org/ontology/Cricketer> . 
?s <http://dbpedia.org/property/testdebutyear> ?o . 
}; 

Выход я получаю

{ 
Subquery 27 
{ 
RDF_QUAD 3.2e+03 rows(s_1_2_t1.S) 
inlined P = #/testdebutyear G = #/dbpedia.org 
RDF_QUAD unq  0.8 rows (s_1_2_t0.S) 
inlined P = ##type , S = s_1_2_t1.S , O = #/Cricketer , G = #/dbpedia.org 
Distinct (s_1_2_t0.S) 

After code: 
     0: s := := artm s_1_2_t0.S 
     4: BReturn 0 
Subquery Select(s) 
} 

After code: 
     0: s := Call __ro2sq (s) 
     5: BReturn 0 
Select (s) 
} 

20 Rows. -- 2 msec. 

Как найти запрос SQL в этом случае? Есть ли какая-то команда или ссылка, которую я пропускаю?

+0

Это «особенность» не как стандарт EXPLAIN, но больше для разработки и отладки, то есть он на самом деле не показывают планы выполнения или тому подобное. – AKSW

+0

Я тоже попробовал EXPLAIN, я просто пытался понять таблицы SPOG, которые есть Virtuoso, и схемы индексирования. Попытка работать, если понимание SQL-запроса помогает. Так что смотрел, как Virtuoso получает правильные смещения, чтобы выбирать экземпляры понятий. – N00bsie

ответ

1

Чтобы ответить на ваш конкретный вопрос, вы можете прочитать further down the same page you pointed to above, где он конкретно рассказывает о том, как «Перевести запрос SPARQL в соответствующий SQL».

Об этом также говорят on another feature-specific page.

(Также обратите внимание, что пример вывода на обеих этих страницах пришли от Виртуоз 6.x, в то время как вы работаете 7.x, так что ваш выход будет, вероятно, все-таки отличаются.)

Вот что я получил от моего местный виртуоз 7.2.4 (Commercial Edition) -

SQL> SET SPARQL_TRANSLATE ON ; 
SQL> SELECT DISTINCT ?s FROM <http://dbpedia.org> WHERE { ?s a <http://dbpedia.org/ontology/Cricketer> . ?s <http://dbpedia.org/property/testdebutyear> ?o . } ; 
SPARQL_TO_SQL_TEXT 
LONG VARCHAR 
_______________________________________________________________________________ 

SELECT __ro2sq ("s_1_2_rbc"."s") AS "s" FROM (SELECT DISTINCT "s_1_2_t0"."S" AS "s" 
    FROM DB.DBA.RDF_QUAD AS "s_1_2_t0" 
    INNER JOIN DB.DBA.RDF_QUAD AS "s_1_2_t1" 
    ON (
     "s_1_2_t0"."S" = "s_1_2_t1"."S") 
    WHERE 
    "s_1_2_t0"."G" = __i2idn (__bft('http://dbpedia.org' , 1)) 
    AND 
    "s_1_2_t0"."P" = __i2idn (__bft('http://www.w3.org/1999/02/22-rdf-syntax-ns#type' , 1)) 
    AND 
    "s_1_2_t0"."O" = __i2idn (__bft('http://dbpedia.org/ontology/Cricketer' , 1)) 
    AND 
    "s_1_2_t1"."G" = __i2idn (__bft('http://dbpedia.org' , 1)) 
    AND 
    "s_1_2_t1"."P" = __i2idn (__bft('http://dbpedia.org/property/testdebutyear' , 1)) 
OPTION (QUIETCAST)) AS "s_1_2_rbc" 

1 Rows. -- 3 msec. 
SQL> SET SPARQL_TRANSLATE OFF ; 

Примечание - эта функция доступна только в командной строке ISQL; он не найден в интерфейсе iSQL на основе браузера.

Все, что сказал ... Я настоятельно рекомендую вам задать нам свои начальные вопросы в будущем, вместо того, чтобы быть отвлеченным на XY Problems. Достаточно мало понять одну таблицу квадрантов (DB.DBA.RDF_QUAD), которая по умолчанию имеет 2 полных и 3 частичных индекса, которых достаточно для большинства типичных применений, all as discussed in the documentation.

Virtuoso Users mailing list часто является лучшим ресурсом для конкретных вопросов, связанных с Virtuoso, чем здесь, где вы, как правило, получаете достаточное количество ответов на догадки.

(ObDisclaimer:. Я работаю OpenLink Software, продюсер Virtuoso)

+0

Вы правы, думая вслух, что мой фактический вопрос больше связан с базовой реализацией таблиц SPOG. Как получить доступ к нему из программы? Я знаю, что это довольно глупый вопрос, но проблема в том, что я хотел бы знать, как работают тройные магазины, то есть те, которые используют базовую реляционную таблицу для хранения RDF. Моя попытка понять их была, посмотрев, как генерируется SQL. Есть ли какая-либо документация о том, как Virtuoso анализирует и выполняет запрос и как он знает, какие смещения выбрать? – N00bsie

+0

Программы получают доступ к [SPOG и другим таблицам RDF] (http://docs.openlinksw.com/virtuoso/rdfquadtables/) оптимально с помощью [запросов/команд SPARQL] (http://docs.openlinksw.com/virtuoso/rdfsparql/), который может быть [выпущен в SQL-соединениях] (http://docs.openlinksw.com/virtuoso/rdfsparqlinline/). Все, что сказал, мне интересно, почему вы преследуете эту линию дознания?Понимание того, как мы делали вещи в Virtuoso, может не помочь вам понять какую-либо другую реализацию ... Итак, какова ваша фактическая цель? (И что означает «что компенсирует выбор?») – TallTed

+0

Вы правы, он отличается для Jena TDB или SDB, и моя цель - понять, как эти базовые таблицы/структуры помогают оценивать результаты запроса и насколько точны они находятся. Линия запроса начинается с этой статьи http://www.csd.uoc.gr/~hy561/papers/storageaccess/optimization/Characteristic%20Sets.pdf и связанной работы, упомянутой для оценки запроса, то есть Stocker et.al. Причина смещения вопроса заключается в том, что я предположил, что все экземпляры Cricketer будут храниться с некоторого смещения. Возможно, это было неправильное предположение. – N00bsie