Add next/prev navigation
diff --git a/org.apache.sling.graphql.samples.website/src/main/java/org/apache/sling/graphql/samples/website/datafetchers/NavigationDataFetcher.java b/org.apache.sling.graphql.samples.website/src/main/java/org/apache/sling/graphql/samples/website/datafetchers/NavigationDataFetcher.java
index 2879a67..9fe2dd1 100644
--- a/org.apache.sling.graphql.samples.website/src/main/java/org/apache/sling/graphql/samples/website/datafetchers/NavigationDataFetcher.java
+++ b/org.apache.sling.graphql.samples.website/src/main/java/org/apache/sling/graphql/samples/website/datafetchers/NavigationDataFetcher.java
@@ -21,11 +21,13 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.StreamSupport;
 
 import org.apache.sling.api.resource.Resource;
+import org.apache.sling.api.resource.ValueMap;
 import org.apache.sling.graphql.samples.website.models.SlingWrappers;
 
 import graphql.schema.DataFetcher;
@@ -38,6 +40,7 @@
 
     public static final String NAME = "navigation";
     public static final String CONTENT_ROOT = "/content/articles";
+    public static final String ARTICLE_RESOURCE_SUPERTYPE = "samples/article";
 
     private final Resource resource;
 
@@ -55,11 +58,41 @@
 
     }
 
+    String getNextOrPreviousPath(Resource r, String propertyName, String currentValue, boolean isNext) {
+        String result = null;
+        final String jcrQuery = String.format(
+            "/jcr:root/content/articles//*[%s %s '%s'] order by %s %s",
+            propertyName,
+            isNext ? ">" : "<",
+            currentValue,
+            propertyName,
+            isNext ? "ascending" : "descending"
+        );
+        final Iterator<Resource> it = r.getResourceResolver().findResources(jcrQuery, "xpath");
+        if(it.hasNext()) {
+            result = it.next().getPath();
+        }
+        return result;
+    }
+
+    /** If r is an article, add previous/next navigation based on article filenames */
+    private void maybeAddPrevNext(Map<String, Object> result, Resource r) {
+        final String propName = "filename";
+        if(ARTICLE_RESOURCE_SUPERTYPE.equals(r.getResourceSuperType())) {
+            final String filename = r.adaptTo(ValueMap.class).get(propName, String.class);
+            if(filename != null) {
+                result.put("previous", getNextOrPreviousPath(r, propName, filename, false));
+                result.put("next", getNextOrPreviousPath(r, propName, filename, true));
+            }
+        }
+    }
+
     @Override
-    public Object get(DataFetchingEnvironment environment) throws Exception {
+    public Object get(DataFetchingEnvironment env) throws Exception {
         final Map<String, Object> result = new HashMap<>();
         result.put("root", CONTENT_ROOT);
         result.put("sections", getSections());
+        maybeAddPrevNext(result, FetcherUtil.getSourceResource(env, resource));
         return result;
     }
 }
\ No newline at end of file
diff --git a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/article.hbs b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/article.hbs
index fab9208..e33b48e 100644
--- a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/article.hbs
+++ b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/article.hbs
@@ -31,6 +31,13 @@
                 <a href="{{this.path}}.html">{{this.name}}</a>
               </span>
             {{/each}}
+            <br/>
+            {{#if data.navigation.previous}}
+              <a href="{{data.navigation.previous}}.html">Previous article</a>
+            {{/if}}
+            {{#if data.navigation.next}}
+            <a href="{{data.navigation.next}}.html">Next article</a>
+            {{/if}}
             <hr/>
         </div>
         
diff --git a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/json.gql b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/json.gql
index 6c12163..8531cbd 100644
--- a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/json.gql
+++ b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/article/json.gql
@@ -19,6 +19,8 @@
 { 
   navigation {
     root
+    previous
+    next
     sections {
       path
       name
diff --git a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/common/GQLschema.jsp b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/common/GQLschema.jsp
index 7b909b8..248f71f 100644
--- a/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/common/GQLschema.jsp
+++ b/org.apache.sling.graphql.samples.website/src/main/resources/SLING-INF/initial-content/apps/samples/common/GQLschema.jsp
@@ -24,6 +24,8 @@
 type Navigation {
   root: String
   sections: [Section]
+  previous: String
+  next: String
 }
 
 type Section {