~~ 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 XQuery processor supports the {{{http://www.jsoniq.org/}JSONiq}} extension to XQuery.
  The focus is on the evaluation of queries on large amounts of JSON and XML data.
  Specifically the goal is to evaluate queries on large collections of relatively small JSON or 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

