This repository has been archived by the owner on Jun 3, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrdf-list-graph.scm
172 lines (137 loc) · 6.83 KB
/
rdf-list-graph.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
;;; -*- Mode: Scheme; scheme48-package: rdf-list-graphs -*-
;;;; Schemantic Web
;;;; RDF Graphs as Triple Lists
;;; This code is written by Taylor R. Campbell and placed in the Public
;;; Domain. All warranties are disclaimed.
(define-record-type <rdf-graph>
(%make-rdf-graph size triples)
rdf-graph?
(size rdf-graph/size set-rdf-graph/size!)
(triples rdf-graph/triples set-rdf-graph/triples!))
(define (make-rdf-graph)
(%make-rdf-graph 0 '()))
(define (rdf-graph/add-triple! graph triple)
(let ((triples (rdf-graph/triples graph)))
(if (not (member triple triples rdf-triple=?))
(begin
(set-rdf-graph/triples! graph (cons triple triples))
(set-rdf-graph/size! graph (+ 1 (rdf-graph/size graph)))))))
(define (rdf-graph/remove-triple! graph triple)
(let ((triples (rdf-graph/triples graph)))
(if (member triple triples rdf-triple=?)
(begin
(set-rdf-graph/triples! graph (delete! triple triples rdf-triple=?))
(set-rdf-graph/size! graph (+ -1 (rdf-graph/size graph)))))))
(define (rdf-graph/purge-matching-objects! graph subject predicate)
(%rdf-graph/purge-matching! graph
subject rdf-triple/subject rdf-subject=?
predicate rdf-triple/predicate
rdf-predicate=?))
(define (rdf-graph/purge-matching-predicates! graph subject object)
(%rdf-graph/purge-matching! graph
subject rdf-triple/subject rdf-subject=?
object rdf-triple/object rdf-object=?))
(define (rdf-graph/purge-matching-subjects! graph predicate object)
(%rdf-graph/purge-matching! graph
predicate rdf-triple/predicate rdf-predicate=?
object rdf-triple/object rdf-object=?))
(define (%rdf-graph/purge-matching! graph a triple/a a=? b triple/b b=?)
(let ((size (rdf-graph/size graph)))
(set-rdf-graph/triples!
graph
(remove! (lambda (triple)
(and (a=? a (triple/a triple))
(b=? b (triple/b triple))
(begin (set! size (- size 1)) #t)))
(rdf-graph/triples graph)))
(set-rdf-graph/size! graph size)))
(define (rdf-graph/purge-triples-by-subject! graph subject)
(%rdf-graph/purge-by! graph subject rdf-triple/subject rdf-subject=?))
(define (rdf-graph/purge-triples-by-predicate! graph predicate)
(%rdf-graph/purge-by! graph predicate rdf-triple/predicate rdf-predicate=?))
(define (rdf-graph/purge-triples-by-object! graph object)
(%rdf-graph/purge-by! graph object rdf-triple/object rdf-object=?))
(define (%rdf-graph/purge-by! graph key triple/key key=?)
(let ((size (rdf-graph/size graph)))
(set-rdf-graph/triples!
graph
(remove! (lambda (triple)
(and (key=? key (triple/key triple))
(begin (set! size (- size 1)) #t)))
(rdf-graph/triples graph)))
(set-rdf-graph/size! graph size)))
(define (rdf-graph/for-each-triple graph procedure)
(for-each procedure (rdf-graph/triples graph)))
(define (rdf-graph/all-triples graph)
(list-copy (rdf-graph/triples graph)))
(define (rdf-graph/for-each-subject graph procedure)
(for-each procedure (rdf-graph/all-subjects graph)))
(define (rdf-graph/for-each-predicate graph procedure)
(for-each procedure (rdf-graph/all-predicates graph)))
(define (rdf-graph/for-each-object graph procedure)
(for-each procedure (rdf-graph/all-objects graph)))
(define (rdf-graph/all-subjects graph)
(delete-duplicates! (map rdf-triple/subject (rdf-graph/triples graph))
rdf-subject=?))
(define (rdf-graph/all-predicates graph)
(delete-duplicates! (map rdf-triple/predicate (rdf-graph/triples graph))
rdf-predicate=?))
(define (rdf-graph/all-objects graph)
(delete-duplicates! (map rdf-triple/object (rdf-graph/triples graph))
rdf-object=?))
(define (rdf-graph/for-each-triple-by-subject graph subject procedure)
(for-each (lambda (triple)
(if (rdf-subject=? subject (rdf-triple/subject triple))
(procedure triple)))
(rdf-graph/triples graph)))
(define (rdf-graph/for-each-triple-by-predicate graph predicate procedure)
(for-each (lambda (triple)
(if (rdf-predicate=? predicate (rdf-triple/predicate triple))
(procedure triple)))
(rdf-graph/triples graph)))
(define (rdf-graph/for-each-triple-by-object graph object procedure)
(for-each (lambda (triple)
(if (rdf-object=? object (rdf-triple/object triple))
(procedure triple)))
(rdf-graph/triples graph)))
(define (rdf-graph/triples-by-subject graph subject)
(filter (lambda (triple)
(rdf-subject=? subject (rdf-triple/subject triple)))
(rdf-graph/triples graph)))
(define (rdf-graph/triples-by-predicate graph predicate)
(filter (lambda (triple)
(rdf-predicate=? predicate (rdf-triple/predicate triple)))
(rdf-graph/triples graph)))
(define (rdf-graph/triples-by-object graph object)
(filter (lambda (triple)
(rdf-object=? object (rdf-triple/object triple)))
(rdf-graph/triples graph)))
(define (rdf-graph/for-each-matching-object graph subject predicate procedure)
(for-each procedure
(rdf-graph/matching-objects graph subject predicate)))
(define (rdf-graph/for-each-matching-predicate graph subject object procedure)
(for-each procedure
(rdf-graph/matching-objects graph subject object)))
(define (rdf-graph/for-each-matching-subject graph predicate object procedure)
(for-each procedure
(rdf-graph/matching-subjects graph predicate object)))
(define (rdf-graph/matching-objects graph subject predicate)
(%rdf-graph/match graph rdf-triple/object rdf-object=?
subject rdf-triple/subject rdf-subject=?
predicate rdf-triple/predicate rdf-predicate=?))
(define (rdf-graph/matching-predicates graph subject object)
(%rdf-graph/match graph rdf-triple/predicate rdf-predicate=?
subject rdf-triple/subject rdf-subject=?
object rdf-triple/object rdf-object=?))
(define (rdf-graph/matching-subjects graph predicate object)
(%rdf-graph/match graph rdf-triple/subject rdf-subject=?
predicate rdf-triple/predicate rdf-predicate=?
object rdf-triple/object rdf-object=?))
(define (%rdf-graph/match graph triple/c c=? a triple/a a=? b triple/b b=?)
(delete-duplicates!
(filter-map (lambda (triple)
(and (a=? a (triple/a triple))
(b=? b (triple/b triple))
(triple/c triple)))
(rdf-graph/triples graph))
c=?))