使用 VALUES 关键字和在查询中直接使用 URI 之间的性能差异?
Difference in performance between using VALUES keyword and using directly the URI in the query?
我有一个相当复杂的 SPARQL 查询,其结构如下所示,涉及多个图形模式,UNION
和嵌套 FILTER NOT EXISTS
。
我希望查询保持通用,并且我希望能够在执行时为某些变量注入值,我的想法是在查询末尾附加一个 VALUES
关键字来指定查询中某些变量的值。在下面的结构中,我设置了 ?x
的值,并在查询中说明了 ?x
适用的所有位置。
但是,在 Fuseki 中,我看到执行这样的查询大约需要 4 到 5 秒,但手动将查询中的 ?x
变量替换为 URI,而不是指定 VALUES
条款,使它 运行 非常快。
- 我一直认为在
WHERE
子句末尾使用 VALUES
关键字就像为某些变量设置内联值,所以我希望使用 VALUES
子句或用相应的 URI 替换变量在查询执行方面是相同的。有人可以确认 VALUES
关键字的预期行为吗?还要解释在 WHERE
子句外部或 WHERE
子句内部使用它之间的区别 ?
- 使用
VALUES
设置的变量出现在 FILTER NOT EXISTS
子句中是否改变了什么?
- 您能否确认这是满足上述要求的正确方法(我希望查询保持通用并且我希望能够在执行时为某些变量注入值)?
- 此行为是否可能特定于 Fuseki 如何处理
VALUES
?
谢谢!
SELECT DISTINCT ...
WHERE {
# ?x ...
# ... basic graph pattern here
{
{
# ... basic graph pattern here
FILTER NOT EXISTS {
# ?x ...
# ... basic graph pattern here
}
FILTER NOT EXISTS {
# ... basic graph pattern here
FILTER NOT EXISTS {
# ?x ...
# ... basic graph pattern here
}
}
}
UNION
{
?x ...
# ... basic graph pattern here
}
UNION
{
# ... basic graph pattern here
FILTER NOT EXISTS {
?x ...
# ... basic graph pattern here
}
FILTER NOT EXISTS {
# ... basic graph pattern here
FILTER NOT EXISTS {
?x ...
# ... basic graph pattern here
}
}
}
UNION
{
?x ...
}
}
}
VALUES ?x { <http://example.com/Foo> }
不应该是一个答案,但在评论中格式化是不可能的...
代数树至少有一些明显的不同。如何处理可能是特定于实现的。安迪比我知道得更多,希望能给出更有用的答案。
没有VALUES
:
查询
SELECT ?s ?o
WHERE
{ { <test_val> <p> ?o }
UNION
{ <test_val> <p> ?o
FILTER NOT EXISTS { <test_val> a ?type }
}
}
代数树(优化)
(base <http://example/base/>
(project (?s ?o)
(union
(bgp (triple <test_val> <p> ?o))
(filter (notexists (bgp (triple <test_val> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type)))
(bgp (triple <test_val> <p> ?o))))))
和VALUES
查询
SELECT ?s ?o
WHERE
{ { ?s <p> ?o }
UNION
{ ?s <p> ?o
FILTER NOT EXISTS { ?s a ?type }
}
}
VALUES ?s { <test_val> }
代数树
(base <http://example/base/>
(project (?s ?o)
(join
(union
(bgp (triple ?s <p> ?o))
(filter (notexists (bgp (triple ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type)))
(bgp (triple ?s <p> ?o))))
(table (vars ?s)
(row [?s <test_val>])
))))
代数树(优化)
(base <http://example/base/>
(project (?s ?o)
(sequence
(table (vars ?s)
(row [?s <test_val>])
)
(union
(bgp (triple ?s <p> ?o))
(filter (notexists (bgp (triple ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type)))
(bgp (triple ?s <p> ?o)))))))
我有一个相当复杂的 SPARQL 查询,其结构如下所示,涉及多个图形模式,UNION
和嵌套 FILTER NOT EXISTS
。
我希望查询保持通用,并且我希望能够在执行时为某些变量注入值,我的想法是在查询末尾附加一个 VALUES
关键字来指定查询中某些变量的值。在下面的结构中,我设置了 ?x
的值,并在查询中说明了 ?x
适用的所有位置。
但是,在 Fuseki 中,我看到执行这样的查询大约需要 4 到 5 秒,但手动将查询中的 ?x
变量替换为 URI,而不是指定 VALUES
条款,使它 运行 非常快。
- 我一直认为在
WHERE
子句末尾使用VALUES
关键字就像为某些变量设置内联值,所以我希望使用VALUES
子句或用相应的 URI 替换变量在查询执行方面是相同的。有人可以确认VALUES
关键字的预期行为吗?还要解释在WHERE
子句外部或WHERE
子句内部使用它之间的区别 ? - 使用
VALUES
设置的变量出现在FILTER NOT EXISTS
子句中是否改变了什么? - 您能否确认这是满足上述要求的正确方法(我希望查询保持通用并且我希望能够在执行时为某些变量注入值)?
- 此行为是否可能特定于 Fuseki 如何处理
VALUES
?
谢谢!
SELECT DISTINCT ...
WHERE {
# ?x ...
# ... basic graph pattern here
{
{
# ... basic graph pattern here
FILTER NOT EXISTS {
# ?x ...
# ... basic graph pattern here
}
FILTER NOT EXISTS {
# ... basic graph pattern here
FILTER NOT EXISTS {
# ?x ...
# ... basic graph pattern here
}
}
}
UNION
{
?x ...
# ... basic graph pattern here
}
UNION
{
# ... basic graph pattern here
FILTER NOT EXISTS {
?x ...
# ... basic graph pattern here
}
FILTER NOT EXISTS {
# ... basic graph pattern here
FILTER NOT EXISTS {
?x ...
# ... basic graph pattern here
}
}
}
UNION
{
?x ...
}
}
}
VALUES ?x { <http://example.com/Foo> }
不应该是一个答案,但在评论中格式化是不可能的...
代数树至少有一些明显的不同。如何处理可能是特定于实现的。安迪比我知道得更多,希望能给出更有用的答案。
没有VALUES
:
查询
SELECT ?s ?o
WHERE
{ { <test_val> <p> ?o }
UNION
{ <test_val> <p> ?o
FILTER NOT EXISTS { <test_val> a ?type }
}
}
代数树(优化)
(base <http://example/base/>
(project (?s ?o)
(union
(bgp (triple <test_val> <p> ?o))
(filter (notexists (bgp (triple <test_val> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type)))
(bgp (triple <test_val> <p> ?o))))))
和VALUES
查询
SELECT ?s ?o
WHERE
{ { ?s <p> ?o }
UNION
{ ?s <p> ?o
FILTER NOT EXISTS { ?s a ?type }
}
}
VALUES ?s { <test_val> }
代数树
(base <http://example/base/>
(project (?s ?o)
(join
(union
(bgp (triple ?s <p> ?o))
(filter (notexists (bgp (triple ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type)))
(bgp (triple ?s <p> ?o))))
(table (vars ?s)
(row [?s <test_val>])
))))
代数树(优化)
(base <http://example/base/>
(project (?s ?o)
(sequence
(table (vars ?s)
(row [?s <test_val>])
)
(union
(bgp (triple ?s <p> ?o))
(filter (notexists (bgp (triple ?s <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> ?type)))
(bgp (triple ?s <p> ?o)))))))