/** *

Database queries - computing distances, neighbors, similarities - API and general documentation.

* *

Introduction

* *

The database query API is designed around the concept of prepared statements.

*

When working with index structures, preprocessors, caches and external data, computing * a distance or a neighborhood is not as simple as running a constant time function. * Some functions may only be defined on a subset of the data, others can be computed much * more efficiently by performing a batch operation. When plenty of memory is available, * caching can be faster than recomputing distances all the time. And often there will be more * than one way of computing the same data * (for example by using an index or doing a linear scan).

* *

Usually, these operations are invoked very often. * Even deciding which method to use at every iteration can prove quite costly when the number * of iterations becomes large. Therefore the goal is to "optimize" once, then invoke the same * handler cheaply. This can be achieved by using "prepared statements" as this would be called * in a traditional RDBMS context.

* *

Prepared queries in ELKI

* *

Prepared statements in ELKI are currently available for: *

* with a quite similar API.

* *

Obtaining query objects

* *

The general process of obtaining a Query is to retrieve it from the database using: *

* as appropriate. See the query class links above for the detailed API. Avoid calling this method within a loop construct!

* *

The query can then be evaluated on objects as needed.

* *

Optimizer hints

* *

In order to assist the database layer to choose the most suitable implementation, one should * also provide so called "hints" as available. In general, any object could be a "hint" to the * database layer (for extensibility), but the following are commonly used:

* * * *

Please set these hints appropriately, since this can effect your algorithms performance!

* *

Full example:

* *
 {@code // Get a kNN query with maxk = 10
 * KNNQuery knnQuery = database.getKNNQuery(EuclideanDistanceFunction.STATIC, 10);
 * // run a 10NN query for each point, discarding the results
 * for(DBID id : database) {
 *   knnQuery.getKNNForDBID(id, 10);
 * }
 * }
* * @apiviz.exclude java.util.* * @apiviz.exclude de.lmu.ifi.dbs.elki.utilities.* */ /* This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures Copyright (C) 2013 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ package de.lmu.ifi.dbs.elki.database.query;