diff options
author | Arun Isaac | 2022-11-04 15:26:31 +0530 |
---|---|---|
committer | Arun Isaac | 2022-11-04 15:26:31 +0530 |
commit | a73fca62199c40808e5bc33093baae08438c3f11 (patch) | |
tree | 58594c1f0734e628095e442748c2a81ffdc1d145 | |
parent | 3ca59162963fa3977659b9e6c987c70df38028ea (diff) | |
download | gn-transform-databases-a73fca62199c40808e5bc33093baae08438c3f11.tar.gz |
Unite importing GeneRIF with dumping SQL data.
* README.md: Document generif-data-file parameter in connection
settings.
* dump.scm: Import (srfi srfi-171), (ice-9 regex) and (zlib).
(decode-html-entities, import-generif): New functions.
(main): Call import-generif.
* import-generif.scm: Delete file.
-rw-r--r-- | README.md | 3 | ||||
-rwxr-xr-x | dump.scm | 57 | ||||
-rwxr-xr-x | import-generif.scm | 74 |
3 files changed, 57 insertions, 77 deletions
@@ -26,7 +26,8 @@ shown below. Take care to replace the placeholders within angle brackets with the appropriate values. ``` scheme -((sql-username . "<sql-username-here>") +((generif-data-file . "/path/to/generifs_basic.gz") + (sql-username . "<sql-username-here>") (sql-password . "<sql-password-here>") (sql-database . "<sql-database-name-here>") (sql-host . "<sql-hostname-here>") @@ -5,12 +5,15 @@ (rnrs io ports) (srfi srfi-1) (srfi srfi-26) + (srfi srfi-171) (ice-9 match) + (ice-9 regex) (ice-9 string-fun) (dump sql) (dump table) (dump triples) - (dump utils)) + (dump utils) + (zlib)) ;;; GeneNetwork database connection parameters and dump path @@ -768,6 +771,55 @@ is a <table> object." (set gn:species (field Species Name)))) +;; Import GeneRIF + +(define decode-html-entities + (cut regexp-substitute/global + #f + ;; We tolerate the absence of the trailing semicolon. + "&#([[:digit:]]+);{0,1}" + <> + 'pre + (compose string integer->char string->number (cut match:substring <> 1)) + 'post)) + +(define (import-generif generif-data-file) + ;; TODO: Link to gene objects, not merely literal Gene IDs. + (triple 'gn:geneId 'rdfs:domain 'gn:geneRIF) + (triple 'gn:geneId 'rdfs:range 'rdfs:Literal) + ;; TODO: Link to gn:publication objects, not merely literal PubMed + ;; IDs. + (triple 'gn:geneRIFEvidencedByPubMedId 'rdfs:domain 'gn:geneRIF) + (triple 'gn:geneRIFEvidencedByPubMedId 'rdfs:range 'rdfs:Literal) + (triple 'gn:geneRIFText 'rdfs:domain 'gn:geneRIF) + (triple 'gn:geneRIFText 'rdfs:range 'rdfs:Literal) + + (call-with-gzip-input-port (open-input-file generif-data-file) + (lambda (port) + ;; Read and discard header. + (get-line port) + ;; Dump other lines. + (port-transduce + (compose (tenumerate) + (tmap (match-lambda + ;; Is there a better way to identify GeneRIF + ;; entries instead of merely enumerating them? + ((i . line) + (match (string-split line #\tab) + ((_ gene-id pubmed-id _ text) + (scm->triples + `((rdf:type . gn:geneRIF) + (gn:geneId . ,(string->number gene-id)) + (gn:pubMedId . ,(string->number pubmed-id)) + ;; Some text has HTML entities. Decode + ;; them. + (gn:geneRIFText . ,(decode-html-entities text))) + (string->identifier "geneRIF" (number->string i))))))))) + (const #t) + get-line + port)))) + + ;; Main function (call-with-genenetwork-database @@ -793,4 +845,5 @@ is a <table> object." (dump-info-files db) (dump-schema db) (dump-case-attributes db) - (dump-groups db))))) + (dump-groups db) + (import-generif (assq-ref %connection-settings 'generif-data-file)))))) diff --git a/import-generif.scm b/import-generif.scm deleted file mode 100755 index 69a5f78..0000000 --- a/import-generif.scm +++ /dev/null @@ -1,74 +0,0 @@ -#! /usr/bin/env guile -!# - -;; This script imports GeneRIF data downloaded from -;; https://ftp.ncbi.nih.gov/gene/GeneRIF/generifs_basic.gz into RDF. - -(use-modules (rnrs io ports) - (srfi srfi-26) - (srfi srfi-171) - (ice-9 match) - (ice-9 regex) - (dump triples) - (dump utils) - (zlib)) - -(define decode-html-entities - (cut regexp-substitute/global - #f - ;; We tolerate the absence of the trailing semicolon. - "&#([[:digit:]]+);{0,1}" - <> - 'pre - (compose string integer->char string->number (cut match:substring <> 1)) - 'post)) - -(define (main generif-data-file dump-directory) - (with-output-to-file (string-append dump-directory "/generif.ttl") - (lambda () - (prefix "rdf:" "<http://www.w3.org/1999/02/22-rdf-syntax-ns#>") - (prefix "rdfs:" "<http://www.w3.org/2000/01/rdf-schema#>") - (prefix "gn:" "<http://genenetwork.org/>") - (newline) - ;; TODO: Link to gene objects, not merely literal Gene IDs. - (triple 'gn:geneId 'rdfs:domain 'gn:geneRIF) - (triple 'gn:geneId 'rdfs:range 'rdfs:Literal) - ;; TODO: Link to gn:publication objects, not merely literal - ;; PubMed IDs. - (triple 'gn:geneRIFEvidencedByPubMedId 'rdfs:domain 'gn:geneRIF) - (triple 'gn:geneRIFEvidencedByPubMedId 'rdfs:range 'rdfs:Literal) - (triple 'gn:geneRIFText 'rdfs:domain 'gn:geneRIF) - (triple 'gn:geneRIFText 'rdfs:range 'rdfs:Literal) - - (call-with-gzip-input-port (open-input-file generif-data-file) - (lambda (port) - ;; Read and discard header. - (get-line port) - ;; Dump other lines. - (port-transduce - (compose (tenumerate) - (tmap (match-lambda - ;; Is there a better way to identify - ;; GeneRIF entries instead of merely - ;; enumerating them? - ((i . line) - (match (string-split line #\tab) - ((_ gene-id pubmed-id _ text) - (scm->triples - `((rdf:type . gn:geneRIF) - (gn:geneId . ,(string->number gene-id)) - (gn:pubMedId . ,(string->number pubmed-id)) - ;; Some text has HTML - ;; entities. Decode them. - (gn:geneRIFText . ,(decode-html-entities text))) - (string->identifier "geneRIF" (number->string i))))))))) - (const #t) - get-line - port)))))) - -(match (command-line) - ((arg0 generif-data-file dump-directory) - (main generif-data-file dump-directory)) - ((arg0 _ ...) - (format (current-error-port) "Usage: ~a GENERIF-DATA-FILE DUMP-DIRECTORY~%" arg0) - (exit #f))) |