1 | //Sparql overview script
|
---|
2 | //Query generation code is fairly messy, watch out!
|
---|
3 |
|
---|
4 | //Creates a new query
|
---|
5 | //containerID: ID of div to draw results in
|
---|
6 | //hardLimit: Returned results limit
|
---|
7 | function newQuery(containerID, GraphType,hardLimit){
|
---|
8 | var Q = new sgvizler.Query();
|
---|
9 | Q.query(generateQuery(hardLimit))
|
---|
10 | .endpointURL(sparqlEndpoint)
|
---|
11 | .endpointOutputFormat("json")
|
---|
12 | .chartFunction($('#sel_ChartType').val())
|
---|
13 | .draw(containerID);
|
---|
14 | }
|
---|
15 |
|
---|
16 | //Checks if all query refinements were entered
|
---|
17 | function isRefinedQuery(){
|
---|
18 | if($('#cb_RefineSearch').is(':checked'))
|
---|
19 | return true;
|
---|
20 | else
|
---|
21 | return false;
|
---|
22 | }
|
---|
23 |
|
---|
24 | //Generates a query based on the predicates etc selected by the user
|
---|
25 | function generateQuery(hardLimit){
|
---|
26 | var predicateURL = $('#sel_Predicate').val();
|
---|
27 | var sparqlQuery = "";
|
---|
28 |
|
---|
29 | //Fix to make queries work when object starts with a '<' or '>'
|
---|
30 | var speechMarks = "\"";
|
---|
31 | if($('#sel_RefineObject').val().substring(0,1)=="<")
|
---|
32 | speechMarks="";
|
---|
33 |
|
---|
34 | //Refine to specific graph if chosen
|
---|
35 | var refineDataset = "GRAPH gsdl:" + collectionName + " {\n";
|
---|
36 | var select;
|
---|
37 | var extra = "";
|
---|
38 | var group;
|
---|
39 |
|
---|
40 | //Depending on what type of graph, adjust query
|
---|
41 | if($('#sel_ChartType').val()=="google.visualization.ImageSparkLine"){
|
---|
42 | select = "SELECT ?a WHERE{";
|
---|
43 | extra = 'BIND (REPLACE(?o, "\\\\D", "") as ?trim)' +
|
---|
44 | "BIND (xsd:integer(SUBSTR(?trim,1,4)) as ?a)" +
|
---|
45 | "FILTER (bound(?a))" +
|
---|
46 | "FILTER (?a > 300)" +
|
---|
47 | "FILTER (?a < 2015)" ;
|
---|
48 |
|
---|
49 | group = "GROUP BY ?a order by ?a\n";
|
---|
50 | }
|
---|
51 | else if ($('#sel_ChartType').val()=="google.visualization.LineChart"){
|
---|
52 | select = "SELECT ?a (COUNT(?a) as ?count) WHERE{";
|
---|
53 | extra = 'BIND (REPLACE(?o, "\\\\D", "") as ?trim)' +
|
---|
54 | "BIND (xsd:integer(SUBSTR(?trim,1,4)) as ?a)" +
|
---|
55 | "FILTER (bound(?a))"+
|
---|
56 | "FILTER (?a > 300)" +
|
---|
57 | "FILTER (?a < 2015)" ;
|
---|
58 | group = "GROUP BY ?a order by ?a\n";
|
---|
59 | }
|
---|
60 | else{
|
---|
61 | select = "SELECT (?o as ?Objects) (COUNT (?o) as ?Count) WHERE {\n" ;
|
---|
62 | group = "GROUP BY ?o ORDER BY DESC(?Count)\n";
|
---|
63 | }
|
---|
64 |
|
---|
65 | sparqlQuery = "PREFIX gsdl: <http://localhost:3030/greenstone/data/> \n";
|
---|
66 | sparqlQuery += "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n";
|
---|
67 |
|
---|
68 | if(isRefinedQuery())
|
---|
69 | sparqlQuery += select +
|
---|
70 | " " + refineDataset +
|
---|
71 | " ?s <"+ predicateURL + "> "+ speechMarks + $('#sel_RefineObject').val() + speechMarks +";\n" +
|
---|
72 | " <"+$('#sel_RefinePredicate').val() +"> ?o\n"
|
---|
73 | + extra +
|
---|
74 | "}\n" ;
|
---|
75 | else
|
---|
76 | sparqlQuery += select +
|
---|
77 | " " + refineDataset +
|
---|
78 | " ?s <" + predicateURL + "> ?o\n "
|
---|
79 | + extra +
|
---|
80 | "}\n";
|
---|
81 |
|
---|
82 | //add extra curly brace for end of GRAPH block
|
---|
83 | sparqlQuery+= "}\n";
|
---|
84 |
|
---|
85 | sparqlQuery += group;
|
---|
86 |
|
---|
87 | //If a limit was selected, apply it
|
---|
88 | if($('#sel_Limit').val()!="None")
|
---|
89 | sparqlQuery += " LIMIT " + $('#sel_Limit').val();
|
---|
90 | else
|
---|
91 | sparqlQuery += " LIMIT " + hardLimit;
|
---|
92 |
|
---|
93 |
|
---|
94 | var query = sparqlQuery;
|
---|
95 | query = query.replace(/</g, '<');
|
---|
96 | query = query.replace(/>/g, '>');
|
---|
97 | query = query.replace(/\n/g, '<br/>');
|
---|
98 |
|
---|
99 | $('#span_sparqlQuery').empty() ;
|
---|
100 | $('#span_sparqlQuery').html(query);
|
---|
101 | return sparqlQuery;
|
---|
102 | }
|
---|
103 |
|
---|
104 | //Updates possible values for predicate selector by sending a query to the
|
---|
105 | //triple-store requesting a list of all predicates.
|
---|
106 | function updatePredicateSelector(){
|
---|
107 | var ajaxSparqlQuery = sparqlEndpoint + "?query=" + encodeURIComponent(overviewSparqlQuery);
|
---|
108 | $.ajax({
|
---|
109 | url: ajaxSparqlQuery,
|
---|
110 | type:"GET",
|
---|
111 | data:"output=json",
|
---|
112 | })
|
---|
113 | .done(function( json ) {
|
---|
114 | var parsedJSON = ((typeof json) == "string") ? $.parseJSON(json) : json;
|
---|
115 | $.each(parsedJSON.results.bindings,function(index,item){
|
---|
116 | var pred = item.Predicate.value;
|
---|
117 | var name = tidyPredicate(pred);
|
---|
118 | $('#sel_Predicate')
|
---|
119 | .append("<option value=\""+pred+"\">" + name + "</option>");
|
---|
120 | $('#sel_RefinePredicate')
|
---|
121 | .append("<option value=\""+pred+"\">" + name + "</option>");
|
---|
122 | });
|
---|
123 | });
|
---|
124 | }
|
---|
125 |
|
---|
126 | //Fill in possible values for 'refine' object selector, based on what predicate the user
|
---|
127 | //has selected before, only existing objects will be available.
|
---|
128 | function updateRefineObjectSelector(predicate){
|
---|
129 | var refineDataset = "GRAPH gsdl:" + collectionName + " {\n";
|
---|
130 |
|
---|
131 | var sparqlQuery = "PREFIX gsdl: <http://localhost:3030/greenstone/data/> \n";
|
---|
132 | sparqlQuery += "SELECT ?obj WHERE{"+
|
---|
133 | refineDataset +
|
---|
134 | " ?s <"+predicate+"> ?obj }}"+
|
---|
135 | "GROUP BY ?obj ORDER BY (?obj)";
|
---|
136 | var ajaxSparqlQuery = sparqlEndpoint + "?query=" + encodeURIComponent(sparqlQuery);
|
---|
137 |
|
---|
138 | $.ajax({
|
---|
139 | url: ajaxSparqlQuery,
|
---|
140 | type:"GET",
|
---|
141 | data:"output=json",
|
---|
142 | })
|
---|
143 | .done(function( json ) {
|
---|
144 | var parsedJSON = ((typeof json) == "string") ? $.parseJSON(json) : json;
|
---|
145 |
|
---|
146 | //Clear selector. Add empty option to start.
|
---|
147 | $('#sel_RefineObject').empty();
|
---|
148 | $('#sel_RefineObject')
|
---|
149 | .append("<option value=\"None\"> </option>");
|
---|
150 |
|
---|
151 | $.each(parsedJSON.results.bindings,function(index,item){
|
---|
152 | var obj;
|
---|
153 | if(item.obj.type == "uri"){
|
---|
154 | obj = "<" + item.obj.value + ">";
|
---|
155 | $('#sel_RefineObject')
|
---|
156 | .append("<option value="+ obj + ">" + obj.substring(0,75) + "</option>");
|
---|
157 | }
|
---|
158 | else{
|
---|
159 | obj = item.obj.value;
|
---|
160 | $('#sel_RefineObject')
|
---|
161 | .append("<option value=\""+ obj +"\">" + obj.substring(0,75) + "</option>");
|
---|
162 | }
|
---|
163 | });
|
---|
164 | $('#sel_RefineObject').next().find('.custom-combobox-input').val("");
|
---|
165 | });
|
---|
166 | }
|
---|
167 |
|
---|
168 | //When the user has selected a predicate and an object to restrict it to, this predicate selector will update
|
---|
169 | //showing the predicates that are available for selection based on what triples will be returned from
|
---|
170 | //the restriction chosen.
|
---|
171 |
|
---|
172 | function updateRefinePredicateSelector(obj){
|
---|
173 | //Perform ajax query to return possible predicate values, given object and predicate values already chosen
|
---|
174 | var predicate = $('#sel_Predicate').val();
|
---|
175 | var sparqlQuery;
|
---|
176 | if(obj.substring(0,1) == "<")
|
---|
177 | sparqlQuery = "SELECT ?predicate WHERE{"+
|
---|
178 | " ?s <" + predicate + "> "+ obj + ";"+
|
---|
179 | " ?predicate ?o}"+
|
---|
180 | "GROUP BY ?predicate ORDER BY DESC(?predicate)";
|
---|
181 | else
|
---|
182 | sparqlQuery = "SELECT ?predicate WHERE{"+
|
---|
183 | " ?s <" + predicate + "> \""+ obj + "\";"+
|
---|
184 | " ?predicate ?o}"+
|
---|
185 | "GROUP BY ?predicate ORDER BY DESC(?predicate)";
|
---|
186 | var ajaxSparqlQuery = sparqlEndpoint + "?query=" + encodeURIComponent(sparqlQuery);
|
---|
187 |
|
---|
188 | $.ajax({
|
---|
189 | url: ajaxSparqlQuery,
|
---|
190 | type:"GET",
|
---|
191 | data:"output=json",
|
---|
192 | })
|
---|
193 | .done(function( json ) {
|
---|
194 | var parsedJSON = ((typeof json) == "string") ? $.parseJSON(json) : json;
|
---|
195 | $('#sel_RefinePredicate').empty();
|
---|
196 | $('#sel_RefinePredicate')
|
---|
197 | .append("<option value=\"None\"> </option>");
|
---|
198 | $.each(parsedJSON.results.bindings,function(index,item){
|
---|
199 | var pred = item.predicate.value;
|
---|
200 | var name = tidyPredicate(pred);
|
---|
201 | $('#sel_RefinePredicate')
|
---|
202 | .append("<option value=\""+pred+"\">" + name + "</option>");
|
---|
203 | });
|
---|
204 | $('#sel_RefinePredicate').next().find('.custom-combobox-input').val("");
|
---|
205 | });
|
---|
206 | }
|
---|
207 |
|
---|
208 |
|
---|
209 | //Hides search-refining elements of page when not needed
|
---|
210 | function toggle_RefineSearch(enable){
|
---|
211 | if(enable)
|
---|
212 | $('#refineControls').toggle("slide", { direction: "up" });
|
---|
213 | else
|
---|
214 | $('#refineControls').toggle("slide", { direction: "up" });
|
---|
215 | }
|
---|
216 |
|
---|
217 | //Tidys up a predicate for easy readability in dropdown lists.
|
---|
218 | function tidyPredicate(name)
|
---|
219 | {
|
---|
220 | name = name.replace("http://purl.org/dc/elements/1.1/","dc.");
|
---|
221 | name = name.replace("http://greenstone.org/gsembedded#","gsembedded.");
|
---|
222 | name = name.replace("http://greenstone.org/gsextracted#","gsextracted.");
|
---|
223 | return name;
|
---|
224 | }
|
---|
225 |
|
---|