#  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.

@prefix rdf:    <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs:	<http://www.w3.org/2000/01/rdf-schema#> .
@prefix mf:     <http://www.w3.org/2001/sw/DataAccess/tests/test-manifest#> .
@prefix qt:     <http://www.w3.org/2001/sw/DataAccess/tests/test-query#> .

<>  rdf:type mf:Manifest ;
    rdfs:label "Quads and quad patterns" ;
    mf:entries
    ( 
       [  mf:name    "Quad-1" ;
          mf:action
            [ qt:query  <quad-01.rq> ;
              qt:data       <data-dft.ttl> ;
              qt:graphData  <data-1.ttl> ;
              qt:graphData  <data-2.ttl> ;
             ]
      ]
       [  mf:name    "Quad-2" ;
          mf:action
            [ qt:query  <quad-02.rq> ;
              qt:data       <data-dft.ttl> ;
              qt:graphData  <data-1.ttl> ;
              qt:graphData  <data-2.ttl> ;
             ]
      ]

        ## Union of named graphs, explicitly named default graph
        ## Complex patterns.

##       [  mf:name    "Basic 00" ;
##          mf:action
##             [ qt:query  <basic-00.rq> ;
##               qt:data   <data-1.ttl> ;
##               qt:graphData ; ]
##       ]
    ) .