31
32
33:- module(rdf_json,
34 [ graph_json/2, 35 properties_to_json/2, 36 rdf_object_to_json/2 37 ]). 38:- use_module(library(semweb/rdf_db)). 39:- use_module(library(semweb/rdf_describe)). 40:- use_module(library(semweb/rdf_bnode)). 41:- use_module(library(pairs)). 42:- use_module(library(apply)). 43:- use_module(library(assoc)). 44:- use_module(library(http/json)). 45:- use_module(library(http/json_convert)). 46:- use_module(library(http/http_json)).
60graph_json(Graph, json(JSON)) :-
61 bnode_vars(Graph, Graph1, BNodes),
62 bnode_ids(BNodes, 1),
63 map_list_to_pairs(arg(1), Graph1, Pairs),
64 keysort(Pairs, Pairs1),
65 group_pairs_by_key(Pairs1, SubjectKeyed),
66 maplist(json_description, SubjectKeyed, JSON).
67
68json_description(S-RDF, Key=json(JSON)) :-
69 uri_key(S, Key, _Type),
70 maplist(po, RDF, POList),
71 keysort(POList, POSorted),
72 group_pairs_by_key(POSorted, PList),
73 properties_to_json(PList, JSON).
74
75po(rdf(_,P,O), P-O).
76
77bnode_ids([], _).
78bnode_ids([bnode(N)|T], N) :-
79 N2 is N + 1,
80 bnode_ids(T, N2).
81
82uri_key(bnode(NodeID), Key, bnode) :- !,
83 atom_concat('_:', NodeID, Key).
84uri_key(BNode, _, _) :-
85 rdf_is_bnode(BNode), !,
86 type_error(rdf_resource, BNode).
87uri_key(URI, URI, uri).
93properties_to_json([], []) :- !.
94properties_to_json([P-Vs|T], [P=JSON|Rest]) :-
95 objects_to_json(Vs, JSON),
96 properties_to_json(T, Rest).
103objects_to_json([], []) :- !.
104objects_to_json([R|T], [json(JSON)|Vs]) :-
105 rdf_object_to_json(R, JSON),
106 objects_to_json(T, Vs).
117rdf_object_to_json(literal(Lit), Object) :- !,
118 Object = [value=Txt, type=literal|Rest],
119 literal_to_json(Lit, Txt, Rest).
120rdf_object_to_json(URI, [value=Key, type=Type]) :-
121 uri_key(URI, Key, Type).
127literal_to_json(lang(Lang, Txt), Txt, [lang=Lang]) :- !.
128literal_to_json(type(Type, Txt), Txt, [datatype=Type]) :- !.
129literal_to_json(Txt, Txt, [])
JSON Representation for RDF graphs