You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jena.apache.org by ca...@apache.org on 2011/09/02 11:07:53 UTC

svn commit: r1164417 - in /incubator/jena/Jena2/ARQ/trunk: src-test/com/hp/hpl/jena/sparql/algebra/optimize/ src/com/hp/hpl/jena/query/ src/com/hp/hpl/jena/sparql/algebra/optimize/ testing/ARQ/Optimization/

Author: castagna
Date: Fri Sep  2 09:07:53 2011
New Revision: 1164417

URL: http://svn.apache.org/viewvc?rev=1164417&view=rev
Log:
JENA-90

A simple optimisation to replace (distinct (order (...) ...) with (reduced (order (...) ...). 
This way we avoid to keep an in-memory data structure for the already seen bindings for DISTINCT-ORDER BY queries.

Added:
    incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformDistinctToReduced.java   (with props)
    incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-01.rq
    incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-01.srj
    incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-02.rq
    incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-02.srj
    incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-03.rq
    incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-03.srj
Modified:
    incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java
    incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/query/ARQ.java
    incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java
    incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/manifest.ttl

Modified: incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java?rev=1164417&r1=1164416&r2=1164417&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src-test/com/hp/hpl/jena/sparql/algebra/optimize/TestOptimizer.java Fri Sep  2 09:07:53 2011
@@ -9,6 +9,7 @@ package com.hp.hpl.jena.sparql.algebra.o
 import org.junit.Test ;
 import org.openjena.atlas.junit.BaseTest ;
 
+import com.hp.hpl.jena.query.ARQ ;
 import com.hp.hpl.jena.query.Query ;
 import com.hp.hpl.jena.query.QueryFactory ;
 import com.hp.hpl.jena.sparql.algebra.Algebra ;
@@ -127,8 +128,9 @@ public class TestOptimizer extends BaseT
         check(queryString, opExpectedString) ;
     }
     
-    @Test public void query_topn_01()
+    @Test public void slice_order_to_topn_01()
     {
+        assertTrue(ARQ.isTrueOrUndef(ARQ.optTopNSorting)) ;
         String queryString = "SELECT * { ?s ?p ?o } ORDER BY ?p ?o LIMIT 42"  ;  
         String opExpectedString = 
             "(top (42 ?p ?o)\n" + 
@@ -136,8 +138,9 @@ public class TestOptimizer extends BaseT
         check(queryString, opExpectedString) ;
     }
     
-    @Test public void query_topn_02()
+    @Test public void slice_order_to_topn_02()
     {
+        assertTrue(ARQ.isTrueOrUndef(ARQ.optTopNSorting)) ;
         String queryString = "SELECT * { ?s ?p ?o } ORDER BY ?p ?o LIMIT 4242"  ;  
         String opExpectedString = 
         	"(slice _ 4242\n" + 
@@ -145,6 +148,49 @@ public class TestOptimizer extends BaseT
             "    (bgp (triple ?s ?p ?o))))" ; 
         check(queryString, opExpectedString) ;
     }
+
+    @Test public void slice_order_to_topn_03()
+    {
+        try {
+            ARQ.setFalse(ARQ.optTopNSorting) ;
+            assertTrue(ARQ.isFalse(ARQ.optTopNSorting)) ;
+            String queryString = "SELECT * { ?s ?p ?o } ORDER BY ?p ?o LIMIT 42"  ;  
+            String opExpectedString = 
+                "(slice _ 42\n" + 
+                "  (order (?p ?o)\n" +
+                "    (bgp (triple ?s ?p ?o))))" ; 
+            check(queryString, opExpectedString) ;
+        } finally {
+            ARQ.unset(ARQ.optTopNSorting) ;
+        }
+    }
+
+    @Test public void distinct_to_reduced_01()
+    {
+        assertTrue(ARQ.isTrueOrUndef(ARQ.optDistinctToReduced)) ;
+        String queryString = "SELECT DISTINCT * { ?s ?p ?o } ORDER BY ?p ?o"  ;  
+        String opExpectedString = 
+            "(reduced \n" + 
+            "  (order (?p ?o)\n" +
+            "    (bgp (triple ?s ?p ?o))))" ; 
+        check(queryString, opExpectedString) ;
+    }
+
+    @Test public void distinct_to_reduced_02()
+    {
+        try {
+            ARQ.setFalse(ARQ.optDistinctToReduced) ;
+            assertTrue(ARQ.isFalse(ARQ.optDistinctToReduced)) ;
+            String queryString = "SELECT DISTINCT * { ?s ?p ?o } ORDER BY ?p ?o"  ;  
+            String opExpectedString = 
+                "(distinct \n" + 
+                "  (order (?p ?o)\n" +
+                "    (bgp (triple ?s ?p ?o))))" ; 
+            check(queryString, opExpectedString) ;
+        } finally {
+            ARQ.unset(ARQ.optDistinctToReduced) ;
+        }
+    }
     
     private static void check(String queryString, String opExpectedString)
     {

Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/query/ARQ.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/query/ARQ.java?rev=1164417&r1=1164416&r2=1164417&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/query/ARQ.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/query/ARQ.java Fri Sep  2 09:07:53 2011
@@ -239,6 +239,12 @@ public class ARQ
      */  
     public static final Symbol optTopNSorting = ARQConstants.allocSymbol("optTopNSorting") ;
     
+    /** 
+     *  Context key controlling whether a DISTINCT-ORDER BY query is done replacing the distinct with a reduced.
+     *  Default is "true" - the reduced operator does not need to keep a data structure with all previously seen bindings.
+     */  
+    public static final Symbol optDistinctToReduced = ARQConstants.allocSymbol("optDistinctToReduced") ;
+
     @Deprecated
     /** @deprecated Use optFilterPlacement */
     public static final Symbol filterPlacement = optFilterPlacement ;

Modified: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java?rev=1164417&r1=1164416&r2=1164417&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java (original)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/Optimize.java Fri Sep  2 09:07:53 2011
@@ -108,7 +108,7 @@ public class Optimize implements Rewrite
     /** Alternative name for compatibility only */
     public static final Symbol filterPlacement2 = ARQConstants.allocSymbol("filterPlacement") ;
     
-    @SuppressWarnings("deprecation")
+    @SuppressWarnings("all")
     public Op rewrite(Op op)
     {
         if ( context.get(ARQConstants.sysOptimizer) == null )
@@ -176,6 +176,9 @@ public class Optimize implements Rewrite
         if ( context.isTrueOrUndef(ARQ.optTopNSorting) )
         	op = apply("TopN Sorting", new TransformTopN(), op) ;
 
+        if ( context.isTrueOrUndef(ARQ.optDistinctToReduced) )
+            op = apply("Distinct replaced with reduced", new TransformDistinctToReduced(), op) ;
+
         op = apply("Path flattening", new TransformPathFlattern(), op) ;
         // Mark
         if ( false )

Added: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformDistinctToReduced.java
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformDistinctToReduced.java?rev=1164417&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformDistinctToReduced.java (added)
+++ incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformDistinctToReduced.java Fri Sep  2 09:07:53 2011
@@ -0,0 +1,38 @@
+/**
+ * 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.
+ */
+
+package com.hp.hpl.jena.sparql.algebra.optimize;
+
+import com.hp.hpl.jena.sparql.algebra.Op ;
+import com.hp.hpl.jena.sparql.algebra.TransformCopy ;
+import com.hp.hpl.jena.sparql.algebra.op.OpDistinct ;
+import com.hp.hpl.jena.sparql.algebra.op.OpOrder ;
+import com.hp.hpl.jena.sparql.algebra.op.OpReduced ;
+
+public class TransformDistinctToReduced extends TransformCopy {
+
+    @Override
+    public Op transform(OpDistinct opDistinct, Op subOp) { 
+        if ( subOp instanceof OpOrder ) {
+            return OpReduced.create(subOp) ;
+        }
+        return super.transform(opDistinct, subOp) ; 
+    }
+
+}
+

Propchange: incubator/jena/Jena2/ARQ/trunk/src/com/hp/hpl/jena/sparql/algebra/optimize/TransformDistinctToReduced.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/manifest.ttl
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/manifest.ttl?rev=1164417&r1=1164416&r2=1164417&view=diff
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/manifest.ttl (original)
+++ incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/manifest.ttl Fri Sep  2 09:07:53 2011
@@ -230,4 +230,29 @@
               qt:data   <data-2.ttl> ] ;
         mf:result  <opt-top-10.srj>
       ]
+
+      [  mf:name    "opt-distinct-to-reduced-01" ;
+         rdf:type   mfx:TestQuery ; 
+         mf:action
+            [ qt:query  <opt-distinct-to-reduced-01.rq> ;
+              qt:data   <data-2.ttl> ] ;
+        mf:result  <opt-distinct-to-reduced-01.srj>
+      ]
+
+      [  mf:name    "opt-distinct-to-reduced-02" ;
+         rdf:type   mfx:TestQuery ; 
+         mf:action
+            [ qt:query  <opt-distinct-to-reduced-02.rq> ;
+              qt:data   <data-2.ttl> ] ;
+        mf:result  <opt-distinct-to-reduced-02.srj>
+      ]
+
+      [  mf:name    "opt-distinct-to-reduced-03" ;
+         rdf:type   mfx:TestQuery ; 
+         mf:action
+            [ qt:query  <opt-distinct-to-reduced-03.rq> ;
+              qt:data   <data-2.ttl> ] ;
+        mf:result  <opt-distinct-to-reduced-03.srj>
+      ]
+
     ).

Added: incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-01.rq
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-01.rq?rev=1164417&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-01.rq (added)
+++ incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-01.rq Fri Sep  2 09:07:53 2011
@@ -0,0 +1,5 @@
+PREFIX : <http://example/>
+
+SELECT DISTINCT ?v 
+{ ?x :p ?v } 
+ORDER BY ?v

Added: incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-01.srj
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-01.srj?rev=1164417&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-01.srj (added)
+++ incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-01.srj Fri Sep  2 09:07:53 2011
@@ -0,0 +1,69 @@
+{
+  "head": {
+    "vars": [ "v" ]
+  } ,
+  "results": {
+    "bindings": [
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "1" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "2" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "3" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "4" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "5" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "6" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "7" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "8" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "9" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "10" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "11" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "12" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "13" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "14" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "15" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "16" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "17" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "18" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "19" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "20" }
+      }
+    ]
+  }
+}

Added: incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-02.rq
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-02.rq?rev=1164417&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-02.rq (added)
+++ incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-02.rq Fri Sep  2 09:07:53 2011
@@ -0,0 +1,6 @@
+PREFIX : <http://example/>
+
+SELECT DISTINCT ?v 
+{ ?x :p ?v } 
+ORDER BY ?v
+LIMIT 6

Added: incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-02.srj
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-02.srj?rev=1164417&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-02.srj (added)
+++ incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-02.srj Fri Sep  2 09:07:53 2011
@@ -0,0 +1,27 @@
+{
+  "head": {
+    "vars": [ "v" ]
+  } ,
+  "results": {
+    "bindings": [
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "1" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "2" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "3" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "4" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "5" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "6" }
+      } 
+    ]
+  }
+}

Added: incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-03.rq
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-03.rq?rev=1164417&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-03.rq (added)
+++ incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-03.rq Fri Sep  2 09:07:53 2011
@@ -0,0 +1,5 @@
+PREFIX : <http://example/>
+
+SELECT DISTINCT ?v 
+{ ?x :p ?v } 
+ORDER BY ?x

Added: incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-03.srj
URL: http://svn.apache.org/viewvc/incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-03.srj?rev=1164417&view=auto
==============================================================================
--- incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-03.srj (added)
+++ incubator/jena/Jena2/ARQ/trunk/testing/ARQ/Optimization/opt-distinct-to-reduced-03.srj Fri Sep  2 09:07:53 2011
@@ -0,0 +1,69 @@
+{
+  "head": {
+    "vars": [ "v" ]
+  } ,
+  "results": {
+    "bindings": [
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "1" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "10" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "11" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "12" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "13" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "14" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "15" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "16" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "17" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "18" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "19" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "2" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "20" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "3" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "4" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "5" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "6" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "7" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "8" }
+      } ,
+      {
+        "v": { "datatype": "http://www.w3.org/2001/XMLSchema#integer" , "type": "typed-literal" , "value": "9" }
+      }
+    ]
+  }
+}