我正在浏览此link,它使用EXPLAIN()
向我们展示Virtuoso为输入SPARQL查询生成(内部使用)的SQL查询。我在我的Virtuoso 7.x版本上试过它,发现我得到了不同的输出。我无法完全理解输出。是否有可能解释iSQL的这个输出意味着什么以及如何从中解释SQL查询?
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 :(得分:1)
要回答您的具体问题,您可以阅读further down the same page you pointed to above,了解如何“将SPARQL查询转换为对应的SQL”。
还讨论了on another feature-specific page。
(另请注意,这两个页面上的示例输出来自Virtuoso 6.x,而您运行的是7.x,因此您的输出可能仍会有所不同。)
这是我从当地的Virtuoso 7.2.4(商业版)获得的内容 -
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的问题,Virtuoso Users mailing list通常是比这里更好的资源,在这里您往往会得到相当多的猜测答案。
(ObDisclaimer:我为OpenLink Software的制作人Virtuoso工作。)