Add RDF end-points for resolving RDF urls.
HEAD mainSigned-off-by: Munyoki Kilyungi <me@bonfacemunyoki.com>
2 files changed, 61 insertions, 6 deletions
diff --git a/gn/db/sparql.scm b/gn/db/sparql.scm
index c38b961..8722966 100755
--- a/gn/db/sparql.scm
+++ b/gn/db/sparql.scm
@@ -18,10 +18,11 @@ the case.
#:use-module (json)
#:use-module (srfi srfi-1)
#:use-module (web client)
+ #:use-module (web http)
#:use-module (web gn-uri)
#:use-module (web request)
+ #:use-module (web response)
#:use-module (web uri)
-
#:export (memo-sparql-species
memo-sparql-species-meta
sparql-species-meta
@@ -37,9 +38,11 @@ the case.
strip-lang
make-table
make-pairs
- )
-)
+ sparql-http-get
+ sparql-by-term))
+(define virtuoso-endpoint
+ (or (getenv "SPARQL-ENDPOINT") "http://localhost:8890/sparql/"))
(define (strip-lang s)
"Strip quotes and language tag (@en) from RDF entries"
@@ -58,9 +61,9 @@ the case.
(define (gn-sparql-prefix query)
(string-append
"
-PREFIX gn: <http://genenetwork.org/id/>
-PREFIX gnt: <http://genenetwork.org/term/>
-PREFIX gnc: <http://genenetwork.org/category/>
+PREFIX gn: <http://rdf.genenetwork.org/v1/id/>
+PREFIX gnt: <http://rdf.genenetwork.org/v1/term/>
+PREFIX gnc: <http://rdf.genenetwork.org/v1/category/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
" query))
@@ -287,3 +290,30 @@ dump-species-metadata.ttl:gn:Axbxa gnt:belongsToSpecies gn:Mus_musculus .
" gnid " ?key ?value .
# FILTER ( !EXISTS{ " gnid " gnt:hasTissue ?value })
}")))
+
+
+(define* (sparql-http-get endpoint-url query #:optional (mime-type "text/microdata+html"))
+ (receive (response-status response-body)
+ (http-request
+ (format #f "~a?default-graph-uri=&query=~a&format=~a"
+ endpoint-url (uri-encode query) (uri-encode mime-type))
+ #:method 'GET)
+ (values
+ (build-response
+ #:code (response-code response-status)
+ #:headers `((content-type . ,(parse-header 'content-type mime-type))))
+ response-body)))
+
+(define (sparql-by-term prefix val)
+ (let ((url-alist '((gn . "<http://rdf.genenetwork.org/v1/id/>")
+ (gnc . "<http://rdf.genenetwork.org/v1/category/>")
+ (gnt . "<http://rdf.genenetwork.org/v1/term/>"))))
+ (format #f "PREFIX ~a: ~a
+
+CONSTRUCT {
+ ~a:~a ?p ?o .
+} FROM <http://rdf.genenetwork.org/v1>
+WHERE {
+ ~a:~a ?p ?o .
+ ?s ?p ?o .
+}" prefix (assoc-ref url-alist prefix) prefix val prefix val)))
diff --git a/web/webserver.scm b/web/webserver.scm
index 0c0bdd1..e2412d2 100644
--- a/web/webserver.scm
+++ b/web/webserver.scm
@@ -327,6 +327,31 @@ otherwise search for set/group data"
#\n)
(render-json (get-id-data (list->string name))))
(rest (render-json "NOP")))))
+ ;; RDF End-points
+ (('GET "v1" "id" id)
+ (receive (sparql-header sparql-resp)
+ (sparql-http-get
+ (or (getenv "SPARQL-ENDPOINT") "http://localhost:8890/sparql/")
+ (sparql-by-term 'gn id))
+ (list '((content-type text/html))
+ (lambda (port)
+ (put-string port sparql-resp)))))
+ (('GET "v1" "category" category)
+ (receive (sparql-header sparql-resp)
+ (sparql-http-get
+ (or (getenv "SPARQL-ENDPOINT") "http://localhost:8890/sparql/")
+ (sparql-by-term 'gnc category))
+ (list '((content-type text/html))
+ (lambda (port)
+ (put-string port sparql-resp)))))
+ (('GET "v1" "term" term)
+ (receive (sparql-header sparql-resp)
+ (sparql-http-get
+ (or (getenv "SPARQL-ENDPOINT") "http://localhost:8890/sparql/")
+ (sparql-by-term 'gnt term))
+ (list '((content-type text/html))
+ (lambda (port)
+ (put-string port sparql-resp)))))
(_ (not-found (request-uri request)))))
(define (request-path-components request)
|