0

上下文:14M 三元组,Blazegraph 工作台。我目前正在尝试设计结合了 SELECT 和 ASK 的查询。更准确地说,我想在我的图表中选择假设正确的结果。

对于我的例子,假设我有很多书,其中有一位作者和一位编辑。我想从作者那里选择他的书通过随机路径长度属性链接到client#1.

就我而言,使用我的数据,像这样直接实现查询需要花费大量时间:

SELECT ?id_book
WHERE {?id_book prefix:hasAuthor :author#1.
        ?id_book prefix:linkedToEditor*/prefix:hasClient :client#1}
ORDER by ?id_book

为了减少微积分的时间(x 1:1000),我正在使用脚本来依次实现这些查询。该脚本选择以作者 n°1 作为作者的书籍:

SELECT ?id_book
WHERE {?id_book prefix:hasAuthor :author#1}
ORDER by ?id_book

如果它链接到客户端 n°1 ,我会询问 1 到 n ( id_book#1, id_book#2, ..., ) 的每个结果:id_book#n

ASK {id_book#i prefix:linkedToEditor*/prefix:hasClient :client#1}

对于相同的结果,后跟 ASK 查询的 SELECT 查询比第一个 SELECT 查询快得多。我不想探索所有的可能性?id_book prefix:linkedToEditor*/prefix:hasClient :client#1;我只想将结果保存在链接存在的地方。我尝试使用 FILTER EXISTS 或两个 SELECT 查询,但查询时间同样长:

SELECT ?id_book
WHERE {?id_book prefix:hasAuthor :author#1.}
FILTER EXIST {?id_book prefix:linkedToEditor*/prefix:hasClient :client#1}
ORDER by ?id_book

或者

SELECT ?id_book
WHERE {?id_book prefix:linkedToEditor*/prefix:hasClient :client#1.
    {SELECT ?id_book
        WHERE {?id_book prefix:hasAuthor :author#1.}
    }
}

如何将我的查询优化为一个查询?

4

1 回答 1

1

您的查询时间存在如此大的差异,这有点令人惊讶;SPARQL 引擎应该能够优化查询以先执行简单的部分,然后再执行更复杂的查询属性路径。排序也可能导致一些时间增加,如果您只对布尔结果感兴趣,这真的不重要。

无论如何,由于嵌套查询首先在最里面执行,因此您可以通过嵌套查询来强制“先执行此操作,然后执行此操作”:

select ?id_book {
  #-- first, get the books by author one
  { select ?id_book { ?id_book prefix:hasAuthor :author#1 } }

  #-- then, then check that the book is related to client one
  ?id_book prefix:linkedToEditor*/prefix:hasClient :client#1
}
order by ?id_book
于 2015-08-17T13:06:23.523 回答