У меня есть довольно небольшой график, содержащий примерно 500 тыс. троек. Я также сгенерировал файл stats.opt и запустил свой код на довольно быстром компьютере (четырехъядерный процессор, 16 ГБ ОЗУ, твердотельный накопитель). Но для запроса, который я создаю с помощью интерфейса OP, требуется вечность. перебрать набор результатов. Набор результатов содержит около 15000 строк, а итерация занимает 4 секунды, что неприемлемо для конечных пользователей. Выполнение запроса занимает всего 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 )
}
(Есть ли лучший способ запросить эти бноды: ?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:длинный ?длинный ; ...`. - person Joshua Taylor   schedule 29.08.2013FILTER ( ?hasBalcony = true )
вам, вероятно, следует просто запросить?apartment dssd:hasBalcony true .
. Есть ли разница в производительности, если вы начнете комбинировать выражения фильтра, например,FILTER ( ?price <= 1000.0e0 && ?price >= 650.0e0 )
. Кроме того, для комнат, если это целочисленное значение, возможно, вы можете использовать{?apt rooms 3} UNION {?apt rooms 4}
. - person Joshua Taylor   schedule 29.08.2013;
. Тем не менее, немного о 3 и 4 комнатах сunion
вместо фильтра иhasBalcony true
вместоfilter( hasBalcony = true )
может ускорить процесс, так как они будут больше ограничивать совпадения, и позже будет меньше фильтров. Точно так же объединение выражений фильтра может быть лучше, но я не знаю, происходит ли это уже автоматически. Во всяком случае, это то, что нужно попробовать. - person Joshua Taylor   schedule 29.08.2013