guile-jsonld/jsonld/deserialize-jsonld.scm

deserialize-jsonld.scm

1
;;;; Copyright (C) 2020 Julien Lepiller <julien@lepiller.eu>
2
;;;; 
3
;;;; This library is free software; you can redistribute it and/or
4
;;;; modify it under the terms of the GNU Lesser General Public
5
;;;; License as published by the Free Software Foundation; either
6
;;;; version 3 of the License, or (at your option) any later version.
7
;;;; 
8
;;;; This library is distributed in the hope that it will be useful,
9
;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
10
;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11
;;;; Lesser General Public License for more details.
12
;;;; 
13
;;;; You should have received a copy of the GNU Lesser General Public
14
;;;; License along with this library; if not, write to the Free Software
15
;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
;;;; 
17
18
(define-module (jsonld deserialize-jsonld)
19
  #:use-module (iri iri)
20
  #:use-module (ice-9 match)
21
  #:use-module (jsonld json)
22
  #:use-module (jsonld generate-blank-node-identifier)
23
  #:use-module (jsonld object-to-rdf)
24
  #:use-module ((rdf rdf) #:hide (blank-node?))
25
  #:export (deserialize-jsonld
26
            well-formed?
27
            rdf-iri
28
            xsd-iri
29
            blank-node->rdf-blank-node))
30
31
(define (uniq lst)
32
  (match lst
33
    (() '())
34
    ((element lst ...)
35
     (if (member element lst)
36
         (uniq lst)
37
         (cons element (uniq lst))))))
38
39
(define (blank-node->rdf-blank-node node)
40
  "Convert a blank node generated from the generate blank node algorithm to
41
a representation suitable for guile-rdf.  This involves removing the leading
42
_:b and converting to a number."
43
  (string->number (substring node 3)))
44
45
(define (rdf-iri name)
46
  (string-append "http://www.w3.org/1999/02/22-rdf-syntax-ns#" name))
47
48
(define (xsd-iri name)
49
  (string-append "http://www.w3.org/2001/XMLSchema#" name))
50
51
(define (well-formed? node)
52
  (or (absolute-iri? node) (blank-node? node)))
53
54
(define* (deserialize-jsonld generate-blank-node node-map dataset
55
                             #:key produce-generalized-rdf? rdf-direction)
56
  ;; 1
57
  (pk 'node-map node-map)
58
  (for-each-pair
59
    (lambda (graph-name graph)
60
      ;; 1.1
61
      (when (or (well-formed? graph-name) (equal? graph-name "@default"))
62
        ;; 1.2
63
        (let ((triples (if (equal? graph-name "@default")
64
                           (rdf-dataset-default-graph dataset)
65
                           '())))
66
          ;; 1.3
67
          (for-each-pair
68
            (lambda (subject node)
69
              ;; 1.3.1
70
              (when (well-formed? subject)
71
                (when (blank-node? subject)
72
                  (set! subject (blank-node->rdf-blank-node subject)))
73
                ;; 1.3.2
74
                (for-each-pair
75
                  (lambda (property values)
76
                    (cond
77
                      ((equal? property "@type")
78
                       (for-each
79
                         (lambda (type)
80
                           (when (well-formed? type)
81
                             (when (blank-node? type)
82
                               (set! type (blank-node->rdf-blank-node type)))
83
                             (set! triples
84
                               (cons
85
                                 (make-rdf-triple subject (rdf-iri "type")
86
                                                  type)
87
                                 triples))))
88
                         (array->list values)))
89
                      ((json-keyword? property)
90
                       #t)
91
                      ((and (blank-node? property) (not produce-generalized-rdf?))
92
                       #t)
93
                      ((not (well-formed? property))
94
                       #t)
95
                      (else
96
                        (when (blank-node? property)
97
                          (set! property (blank-node->rdf-blank-node property)))
98
                        (for-each
99
                          (lambda (item)
100
                            (let* ((res
101
                                     (object-to-rdf generate-blank-node
102
                                                    rdf-direction item '()))
103
                                   (list-triples (assoc-ref res "list-triples"))
104
                                   (res (assoc-ref res "result")))
105
                              (unless (json-null? res)
106
                                (set! triples
107
                                  (cons
108
                                    (make-rdf-triple subject property res)
109
                                    (append triples list-triples))))))
110
                          (array->list values)))))
111
                  (alist-sort-by-key node))))
112
            (alist-sort-by-key graph))
113
          ;; 1.2 (cont.)
114
          (set! triples (uniq triples))
115
          (if (equal? graph-name "@default")
116
              (set! dataset
117
                (make-rdf-dataset triples (rdf-dataset-named-graphs dataset)))
118
              (unless (null? triples)
119
                (set! dataset
120
                  (make-rdf-dataset (rdf-dataset-default-graph dataset)
121
                                    (alist-set
122
                                      (rdf-dataset-named-graphs dataset)
123
                                      (if (blank-node? graph-name)
124
                                          (blank-node->rdf-blank-node graph-name)
125
                                          graph-name)
126
                                      triples))))))))
127
    node-map)
128
  dataset)
129