/
node-rdf2json.js
150 lines (145 loc) · 4.76 KB
/
node-rdf2json.js
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
var http = require("http");
var sys = require("sys");
var RDF = require("../vendor/rdf-parser/parser").RDF;
var fs = require("fs");
function generateFlatRDFJSONString(triples) {
var rdfjson = "";
for ( var i = 0; i < triples.length; i++) {
rdfjson += "{";
var subject = triples[i].subject.toString();
var predicate = triples[i].predicate.toString();
var object = triples[i].object == undefined ? undefined
: triples[i].object.toString();
var lang = triples[i].lang ? triples[i].lang.toString() : "";
var datatype = triples[i].datatype ? triples[i].datatype.toString()
: "";
if (triples[i].type == "resource") {
rdfjson += "\"s\" : { \"type\" : \"uri\", \"uri\" : \"" + subject
+ "\" },";
rdfjson += "\"p\" : \"" + predicate + "\",";
rdfjson += "\"o\" : { \"type\" : \"uri\", \"uri\" : \"" + object
+ "\" }";
} else {
rdfjson += "\"s\" : { \"type\" : \"uri\", \"uri\" : \"" + subject
+ "\" },";
rdfjson += "\"p\" : \"" + predicate + "\",";
rdfjson += "\"o\" : { \"type\" : \"literal\", \"val\" : \""
+ object + "\" , \"lang\" : \"" + lang
+ "\", \"datatype\" : \"" + datatype + "\"}";
}
if (i != (triples.length - 1)) {
rdfjson += "},";
} else {
rdfjson += "}";
}
}
return rdfjson;
}
function _toRDFJSON(rdf, type, callback) {
var rdfjson = "";
if (type.toLowerCase() == "flat") {
var triples = rdf.Match(null, null, null, null);
rdfjson += "{ \"data\" : [";
rdfjson += generateFlatRDFJSONString(triples);
rdfjson += "]}";
} else if (type.toLowerCase() == "sparql") {
var triples = rdf.Match(null, null, null, null);
rdfjson += "{ \"head\" : { \"vars\" : [\"s\", \"p\", \"o\"]},";
rdfjson += "\"results\" : { \"bindings\" : [";
rdfjson += generateFlatRDFJSONString(triples);
rdfjson += "]}}";
} else if (type.toLowerCase() == "talis") {
var triples = rdf.Match(null, null, null, null);
sys.puts(sys.inspect(triples));
var subjects = new Array();
for ( var i = 0; i < triples.length; i++) {
if (subjects.indexOf(triples[i].subject) != -1) {
continue;
} else {
subjects.push(triples[i].subject);
}
}
rdfjson += "{";
for ( var i = 0; i < subjects.length; i++) {
rdfjson += " \"" + subjects[i] + "\" : {";
var groupSubjects = rdf.Match(null, subjects[i], null, null);
var predicates = new Array();
for ( var j = 0; j < groupSubjects.length; j++) {
if (predicates.indexOf(groupSubjects[j].predicate) != -1) {
continue;
} else {
predicates.push(groupSubjects[j].predicate);
}
}
for ( var j = 0; j < predicates.length; j++) {
rdfjson += "\"" + predicates[j] + "\" : [";
groupObjects = rdf
.Match(null, subjects[i], predicates[j], null);
for ( var k = 0; k < groupObjects.length; k++) {
var object = groupObjects[k].object;
if (!groupObjects[k].type)
continue;// TODO If the parsing result is correct,
// each statement should always have this
// type info.
if (groupObjects[k].type.toString() == "literal") {
rdfjson += "{ \"value\" : \"" + object.toString()
+ "\", \"type\" : \"uri\"";
if (groupObjects[k].datatype) {
rdfjson += ", \"datatype\" : \""
+ groupObjects[k].datatype.toString()
+ "\"";
}
if (groupObjects[k].lang) {
rdfjson += ", \"lang\" : \""
+ groupObjects[k].lang.toString() + "\"";
}
rdfjson += "}";
} else if (groupObjects[k].type.toString() == "resource") {
if (object.toString().substr(0, 2) == "_:n") {
rdfjson += "{ \"value\" : \"" + object.toString()
+ "\", \"type\" : \"bnode\"}";
} else {
rdfjson += "{ \"value\" : \"" + object.toString()
+ "\", \"type\" : \"uri\"}";
}
}
if (k < groupObjects.length - 1) {
rdfjson += ",";
}
}
rdfjson += "]";
if (j < predicates.length - 1)
rdfjson += ",";
}
rdfjson += "}";
if (i < subjects.length - 1)
rdfjson += ",";
}
rdfjson += "}";
}
callback(null, rdfjson);
}
exports.convertStringIntoRDFJSON = function(rdfxml, type, callback) {
var rdf = new RDF();
rdf.loadRDFXML(rdfxml);
_toRDFJSON(rdf, type, function(err, rdfjson) {
callback(null, rdfjson);
});
};
exports.convertFileIntoRDFJSON = function(filepath, type, callback) {
var self = this;
var rdf = new RDF();
fs.readFile(filepath, function(err, data) {
self.convertStringIntoRDFJSON(data, type, function(err, rdfjson) {
callback(null, rdfjson);
});
});
};
exports.convertURLIntoRDFJSON = function(url, type, callback) {
var rdf = new RDF();
rdf.getRDFURL(url, function() {
_toRDFJSON(rdf, type, function(err, rdfjson) {
callback(null, rdfjson);
});
});
};