File: rdf_pl.pl

package info (click to toggle)
swi-prolog 9.0.4%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 82,408 kB
  • sloc: ansic: 387,503; perl: 359,326; cpp: 6,613; lisp: 6,247; java: 5,540; sh: 3,147; javascript: 2,668; python: 1,900; ruby: 1,594; yacc: 845; makefile: 428; xml: 317; sed: 12; sql: 6
file content (128 lines) | stat: -rw-r--r-- 2,893 bytes parent folder | download | duplicates (4)
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
:- module(rdf_pl,
          [ rdf/3,                              % ?S,?P,?O
            rdf/4,                              % ?S,?P,?O,?G
            rdf/5,                              % ?S,?P,?O,?G,?Gen
            rdf_subject/1,                      % ?S
            rdf_current_predicate/1,            % ?P
            rdf_assert/4,                       % +S,+P,+O,+G
            rdf_assert/3,                       % +S,+P,+O
            rdf_retractall/3,                   % ?S,?P,?O
            rdf_retractall/4,                   % ?S,?P,?O,?G
            rdf_reset_db/0,
            rdf_statistics/1
          ]).

/** <module> Create random graphs

Operations:
        - Create a property
        - Add/Del triples for a property
        - Add/Del a subPropertyOf relation
          - Extend a tree
          - Make multiple inheritance in a tree
          - Create cycle in a tree

Shadow DB is a graph. We do not need literals. Triples are represented
as

        triple(S,P,O,G,Born,Id)
        died(Id, Died)
*/

:- dynamic
    subject/1,
    predicate/1,
    triple/6,
    died/2,
    triple_id/1,
    generation/1.

rdf_reset_db :-
    retractall(subject(_)),
    retractall(predicate(_)),
    retractall(triple(_,_,_,_,_,_)),
    retractall(died(_,_)),
    retractall(triple_id(_)),
    retractall(generation(_)).

rdf_statistics(triples(Count)) :-
    predicate_property(triple(_,_,_,_,_,_), number_of_clauses(Count)).

rdf_assert(S,P,O) :-
    rdf_assert(S,P,O,user).

rdf_assert(S,P,O,G) :-
    with_mutex(triple_db, t_assert_(S,P,O,G)).


rdf(S,P,O) :-
    rdf(S,P,O,_).

rdf(S,P,O,G) :-
    generation(Gen),
    rdf(S,P,O,G,Gen).

rdf(S,P,O,G,Gen) :-
    rdf(S,P,O,G,Gen,_).

rdf(S,P,O,G,Gen,Id) :-
    triple(S,P,O,G,Born,Id),
    Gen >= Born,
    \+ (  died(Id, Died),
          Gen >= Died
       ).

rdf_subject(S) :-
    subject(S).

rdf_current_predicate(S) :-
    predicate(S).

rdf_retractall(S,P,O) :-
    rdf_retractall(S,P,O,_).

rdf_retractall(S,P,O,G) :-
    generation(Gen),
    with_mutex(triples,
               (   rdf(S,P,O,G,Gen,Id),
                   next_generation(Died),
                   assertz(died(Id, Died)),
                   fail
               ;   true
               )).

t_assert_(S,P,O,G) :-
    next_triple_id(Id),
    next_generation(Gen),
    assertz(triple(S,P,O,G,Gen,Id)),
    assert_subject(S),
    assert_predicate(P).

next_triple_id(Id) :-
    retract(triple_id(Id0)),
    !,
    Id is Id0+1,
    assertz(triple_id(Id)).
next_triple_id(1) :-
    assertz(triple_id(1)).

next_generation(Gen) :-
    retract(generation(Gen0)),
    !,
    Gen is Gen0+1,
    assertz(generation(Gen)).
next_generation(1) :-
    assertz(generation(1)).

assert_subject(S) :-
    subject(S),
    !.
assert_subject(S) :-
    assertz(subject(S)).

assert_predicate(P) :-
    predicate(P),
    !.
assert_predicate(P) :-
    assertz(predicate(P)).