【发布时间】:2013-08-29 17:17:27
【问题描述】:
我有一个相当小的图表,其中包含大约 50 万个三元组。我还生成了 stats.opt 文件并在相当快的计算机(四核、16gb 内存、ssd 驱动器)上运行我的代码。但是对于我在 OP 接口的帮助下构建的查询,它需要永远遍历结果集。结果集大约有15000行,迭代需要4s,这对于最终用户来说是无法接受的。执行查询只需要 90 毫秒(我猜真正的工作是由游标迭代完成的?)。为什么这么慢,我该怎么做才能加快结果集迭代?
这里是查询:
SELECT ?apartment ?price ?hasBalcony ?lat ?long ?label ?hasImage ?park ?supermarket ?rooms ?area ?street
WHERE
{ ?apartment dssd:hasBalcony ?hasBalcony .
?apartment wgs84:lat ?lat .
?apartment wgs84:long ?long .
?apartment rdfs:label ?label .
?apartment dssd:hasImage ?hasImage .
?apartment dssd:hasNearby ?hasNearbyPark .
?hasNearbyPark dssd:hasNearbyPark ?park .
?apartment dssd:hasNearby ?hasNearbySupermarket .
?hasNearbySupermarket dssd:hasNearbySupermarket ?supermarket .
?apartment dssd:price ?price .
?apartment dssd:rooms ?rooms .
?apartment dssd:area ?area .
?apartment vcard:hasAddress ?address .
?address vcard:streetAddress ?street
FILTER ( ?hasBalcony = true )
FILTER ( ?price <= 1000.0e0 )
FILTER ( ?price >= 650.0e0 )
FILTER ( ?rooms <= 4.0e0 )
FILTER ( ?rooms >= 3.0e0 )
FILTER ( ?area <= 100.0e0 )
FILTER ( ?area >= 60.0e0 )
}
(有没有更好的方法来查询这些 bnode:?hasNearbyPark, ?hasNearbySupermarket)
以及执行查询的代码:
dataset.begin(ReadWrite.READ);
Model model = dataset.getNamedModel("http://example.com");
QueryExecution queryExecution = QueryExecutionFactory.create(buildQuery(), model);
ResultSet resultSet = queryExecution.execSelect();
while ( resultSet.hasNext() ) {
QuerySolution solution = resultSet.next(); ...
【问题讨论】:
-
您可以将
?apartment dssd:hasNearby [ dssd:hasNearbyPark ?park ]和?apartment dssd:hasNearby [ dssd:hasNearbySupermarket ?supermarket ]用于公园和超市,同样用于?address,除了获取?street之外,您似乎不会使用它。您也可以使用;节省大量输入。例如,而不是?apartment wgs84:lat ?lat .?apartment wgs84:long ?long ., use?apartment wgs84:lat ?lat ; wgs84:long ?long ; ...`。 -
好吧,我正在使用 OP 以编程方式构建查询,所以我对此没有任何影响。这会改变执行时间吗?
-
而不是
FILTER ( ?hasBalcony = true ),您应该只使用?apartment dssd:hasBalcony true .进行查询。如果您开始组合过滤器表达式,例如FILTER ( ?price <= 1000.0e0 && ?price >= 650.0e0 ),是否有任何性能差异。另外,对于房间,如果这是一个整数值,也许你可以使用{?apt rooms 3} UNION {?apt rooms 4}。 -
空白节点语法是等价的。手写,空白节点语法可能更美观,但它的效率或多或少。
;的缩短也是如此。但是,使用union而不是过滤器和hasBalcony true而不是filter( hasBalcony = true )的 3 和 4 间房间可能会加快速度,因为它们会更多地限制匹配,并且过滤器会更少之后。同样,组合过滤器表达式可能会更好,但我不知道这是否已经自动发生。无论如何,这是值得尝试的。 -
我刚刚尝试执行这样的查询: