~~ Licensed to the Apache Software Foundation (ASF) under one or more
~~ contributor license agreements.  See the NOTICE file distributed with
~~ this work for additional information regarding copyright ownership.
~~ The ASF licenses this file to You under the Apache License, Version 2.0
~~ (the "License"); you may not use this file except in compliance with
~~ the License.  You may obtain a copy of the License at
~~
~~     http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing, software
~~ distributed under the License is distributed on an "AS IS" BASIS,
~~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~~ See the License for the specific language governing permissions and
~~ limitations under the License.

Apache VXQuery

  Apache VXQuery\x99 will be a standards compliant XML Query processor implemented in Java.
  The focus is on the evaluation of queries on large amounts of XML data.
  Specifically the goal is to evaluate queries on large collections of relatively small XML documents.
  To achieve this queries will be evaluated on a cluster of shared nothing machines.

  There are lots of large collections of relatively small documents like e.g. the {{{http://www.sec.gov/info/edgar/ednews/dissemin.htm}EDGAR dataset}} or the {{{http://wiki.openstreetmap.org/wiki/Download}OpenStreetMap dataset}}.
  However there are no XQuery processors available today that are capable of processing these datasets in parallel and making the contained information accessible.


[images/vxquery_stack.png] VXQuery Stack Diagram

