root/SPARQLBuilderWWW/web/sparqlbuilder.js @ 243

リビジョン 232, 38.4 KB (コミッタ: lenz, 10 年 前)

BH14.14の作業成果

新UIと埋め込み方式の変更、結果のダウンロードボタン

残タスク:サンプル関係。サンプルボタンもGETでいきなりオープンも指定結果のパーマリンク作成もまだ

  • 属性 svn:mime-type の設定値 text/plain
行番号 
1var SPARQLBuilder = function(result,endpoint) {
2    this.result = result;
3    this.builder = this.createBuilder('http://www.sparqlbuilder.org/forms/guiform.php');
4    this.showBuilder();
5    this.drawGraph = null;
6    this.startClass = null;
7    this.endClass = null;
8    this.endPoint = endpoint;
9};
10
11SPARQLBuilder.prototype.createBuilder = function(form) {
12    var builder = $('<div class="SparqlBuilder"></div>');
13    var content = $('<div class="SparqlBuilderContent"></div>');
14    builder.prepend(content);
15    var self = this;
16    $.ajax({
17        type : "GET",
18        url : form,
19        async : false,
20        success : function(data) {
21            content.prepend($(data));
22        }
23    });
24    $("body").prepend(builder);
25    return builder;
26};
27
28SPARQLBuilder.prototype.showBuilder = function() {
29    var width = $(document).width();
30    var height = $(document).height();
31    this.builder.css("width", width);
32    this.builder.css("height", height);
33    this.builder.css("display", "block");
34
35    document.getElementById("sparqlBuilderAjaxload").style.width = width;
36    document.getElementById("sparqlBuilderAjaxload").style.height = height;
37    this.loadIcon("hide");
38
39    var self = this;
40    this.loadEndPointList();
41
42    $("#EndPointSelect").change(function() {
43        self.changeEndPoint();
44    });
45    //$("#SetClassButton").click(function() {
46    //    self.startClass = $("#StartClassSelect").val();
47    //    self.endClass = $("#EndClassSelect").val();
48    //    self.loadPathList();
49    //});
50    $("#StartClassSelect").change(function() {
51        self.startClass = $("#StartClassSelect").val();
52        self.loadPathList();
53    });
54    $("#EndClassSelect").change(function() {
55        self.endClass = $("#EndClassSelect").val();
56        self.loadPathList();
57    });
58    $("#sparqlBuilderViewall").click(function() {
59        self.drawGraph.setPathLimit(0);
60        self.drawGraph.view_map();
61    });
62    $("#GenerateSPARQLButton").click(function() {
63        var sparql = self.generateSPARQL(self.drawGraph.pathobj);
64    });
65    $("#SparqlBuilderCancel").click(function() {
66        self.hideBuilder();
67    });
68};
69
70SPARQLBuilder.prototype.loadIcon = function(mode) {
71   if(mode == "view"){
72      document.getElementById("sparqlBuilderAjaxload").style.display = "block";
73   }else{
74      document.getElementById("sparqlBuilderAjaxload").style.display = "none";
75   }
76};
77
78SPARQLBuilder.prototype.loadEndPointList = function() {
79    var url = 'http://www.sparqlbuilder.org/api/eplist';
80    $.ajax({
81        url: url,
82        success: function(data) {
83            var list = eval(data);
84            var event = new $.Event('complete');
85            $("#EndPointSelect").empty();
86            $("#EndPointSelect").append('<option>SELECT</option>');
87            for (var i = 0; i < list.length; ++i) {
88                $("#EndPointSelect").append('<option value="' + list[i] + '">' + list[i] + '</option>');
89            }
90            $("#seclass").trigger(new $.Event('epcomplete'));
91        },
92    });
93};
94
95SPARQLBuilder.prototype.loadClassList = function() {
96    var url = "http://www.sparqlbuilder.org/api/clist?ep=" + encodeURIComponent(this.endpoint);
97    //var url = "http://localhost:8080/api/clist?ep=" + encodeURIComponent(this.endpoint);
98    $.ajax({
99        type : "GET",
100        url : url,
101        async : false,
102        success : function(data) {
103            var list = eval(data);
104            var event = new $.Event('complete');
105            $("#StartClassSelect").empty();
106            $("#EndClassSelect").empty();
107            for (var i = 0; i < list.length; ++i) {
108                //$("#StartClassSelect").append('<option value="' + list[i]['uri'] + '">' + list[i]['display'] + '</option>');
109                //$("#EndClassSelect").append('<option value="' + list[i]['uri'] + '">' + list[i]['display'] + '</option>');
110                $("#StartClassSelect").append('<option value="' + list[i]['uri'] + '">' + list[i]['label'] + ' (' + list[i]['number'] + ')' + '</option>');
111                $("#EndClassSelect").append('<option value="' + list[i]['uri'] + '">' + list[i]['label'] + ' (' + list[i]['number'] + ')' + '</option>');
112            }
113            $("#seclass").trigger(new $.Event('secomplete'));
114        }
115    });
116};
117
118SPARQLBuilder.prototype.loadSamplePathList = function() {
119    var url = "http://www.sparqlbuilder.org/api/plist?ep=" + encodeURIComponent('http://www.ebi.ac.uk/rdf/services/reactome/sparql')
120                                          + "&startclass=" + encodeURIComponent('http://www.biopax.org/release/biopax-level3.owl#Protein')
121                                          + "&endclass="   + encodeURIComponent('http://www.biopax.org/release/biopax-level3.owl#Pathway');
122    //var url = "http://localhost:8080/api/plist?ep=" + encodeURIComponent(this.endpoint)
123    //                                      + "&startclass=" + encodeURIComponent(startclass)
124    //                                      + "&endclass="   + encodeURIComponent(endclass);
125    var self = this;
126    self.loadIcon("view");
127    setTimeout(function(){
128
129        $.ajax({
130            type : "GET",
131            url : url,
132            async : false,
133            timeout : 1000000,
134            success : function(data) {
135                var width = $(".SparqlBuilderContent").width();
136                self.drawGraph = new SPARQLBuilderDrawGraph(data, width, 10);
137                self.loadIcon("hide");
138                self.drawGraph.view_map();
139                $('select[name="selectendpoint"]').val('http://www.ebi.ac.uk/rdf/services/reactome/sparql');
140            },
141            error: function(data){
142                self.loadIcon("hide");
143                alert("error: ", data);
144            }
145        });
146    }, 100)
147};
148
149SPARQLBuilder.prototype.loadPathList = function() {
150    if (this.startClass == null || this.endClass == null ){ return; }
151    var startclass = $("#StartClassSelect").val();
152    var endclass = $("#EndClassSelect").val();
153    var url = "http://www.sparqlbuilder.org/api/plist?ep=" + encodeURIComponent(this.endpoint)
154                                          + "&startclass=" + encodeURIComponent(startclass)
155                                          + "&endclass="   + encodeURIComponent(endclass);
156    //var url = "http://localhost:8080/api/plist?ep=" + encodeURIComponent(this.endpoint)
157    //                                      + "&startclass=" + encodeURIComponent(startclass)
158    //                                      + "&endclass="   + encodeURIComponent(endclass);
159    var self = this;
160    self.loadIcon("view");
161    setTimeout(function(){
162
163        $.ajax({
164            type : "GET",
165            url : url,
166            async : false,
167            timeout : 1000000,
168            success : function(data) {
169                var width = $(".SparqlBuilderContent").width();
170                self.drawGraph = new SPARQLBuilderDrawGraph(data, width, 10);
171                self.loadIcon("hide");
172                self.drawGraph.view_map();
173            },
174            error: function(data){
175                self.loadIcon("hide");
176                alert("error: ", data);
177            }
178        });
179    }, 100)
180};
181
182SPARQLBuilder.prototype.changeEndPoint = function() {
183    this.endpoint = $("#EndPointSelect").val();
184    this.loadClassList();
185};
186
187SPARQLBuilder.prototype.hideBuilder = function() {
188    this.builder.hide();
189};
190
191SPARQLBuilder.prototype.generateSPARQL = function(pathobj) {
192    var path = JSON.stringify(pathobj);
193    var url = 'http://www.sparqlbuilder.org/api/sparql?path=' + encodeURIComponent(path);
194    var sparql = '';
195    var self = this;
196    $.ajax({
197        type: "GET",
198        url : url,
199        dataType: 'text',
200        async: false,
201        success : function(data) {
202            var event = new $.Event('write');
203            $("#" + self.result).val(data);
204            $("#" + self.endPoint).val(self.endpoint);
205            self.hideBuilder();
206            $("#" + self.result).trigger(event, [data, pathobj]);
207        }
208    });
209};
210
211var SPARQLBuilderDrawGraph = function(jsontext, width, pathlimit) {
212    this.jsontext = jsontext;
213    this.width = width;
214    this.pathlimit = pathlimit;
215    this.pathobj = null;
216};
217
218SPARQLBuilderDrawGraph.prototype.setPathLimit = function(pathlimit) {
219    this.pathlimit = pathlimit;
220};
221
222SPARQLBuilderDrawGraph.prototype.view_map = function(){
223
224    // make_data繝。繧ス繝�ラ縺ョ邨先棡繧貞叙蠕�
225    var json = this.make_data(0);
226
227    if(json['nodes'].length != 0){
228
229        // 蜃コ譚・荳翫′縺」縺溽オ先棡繧呈ク。縺励※繝槭ャ繝嶺ク翫�繝ュ繧ア繝シ繧キ繝ァ繝ウ繧偵そ繝�ヨ
230        this.set_map_location(0, json['nodes'], json['links']);
231
232        // SVG縺ョ蟷�→鬮倥&繧定ィュ螳夲シ亥ケ�シ夂判髱「縺�▲縺ア縺�€€鬮倥&�壹ヱ繧ケ縺ョ謨ー縺ォ蠢懊§險ュ螳夲シ�
233        var width = this.width;
234        var height = (width * 9 / 16);
235        var graphheight = ((this.NODEHEIGHT * 1.5) * this.PATHNUM) + (this.NODEHEIGHT / 2);
236
237        var scoreleftmargin = this.NODEHEIGHT * 1.5;
238
239        // 繧ォ繝ゥ繝シ繧貞叙蠕�
240        var color = d3.scale.category20();
241
242        // SVG縺ョ蜑企勁
243        d3.select("#sparqlBuilderGraph").html("");
244        // 逕サ髱「繧オ繧、繧コ縺ォ蜷医o縺婀VG縺ョ霑ス蜉
245        var svg = d3.select("#sparqlBuilderGraph").append("svg")
246            .attr("width", width)
247            .attr("height", height)
248            .attr("viewBox", "0 0 " + width + " " + height)
249            .on("mousewheel", function(){
250                var vb = svg.attr("viewBox");
251                var spvb = vb.split(" ");
252
253                var vby = (parseInt(spvb[1]) - event.wheelDelta);
254
255                if(vby < 0){
256                        vby = 0;
257                }else if(vby > (graphheight - height)){
258                        vby = (graphheight - height);
259                }else{
260                        event.preventDefault();
261                }
262
263                svg.attr("viewBox", "0 " + vby + " " + width + " " + height);
264            });
265
266        // 閭梧勹縺ョ霑ス蜉
267        var bg = svg
268            .append("rect")
269            .attr("x", 0)
270            .attr("y", 0)
271            .attr("width", width)
272            .attr("height", graphheight)
273            .attr("fill", "#fafafa");
274
275        // links驟榊�繧呈ク。縺励Μ繝ウ繧ッ縺ョ菴懈�
276        var link = svg.selectAll(".link")
277            .data(json.links)
278            .enter().append("line")
279            .attr("class", "link")
280            .style("stroke", "#999")
281            .style("stroke-opacity", 0.6)
282            .style("stroke-width", function(d) { return Math.sqrt(d.value);});
283
284        // nodes驟榊�繧呈ク。縺励ヮ繝シ繝峨�菴懈�
285        var node = svg.selectAll(".node")
286            .data(json.nodes)
287            .enter().append("circle")
288            .attr("class", "node")
289            .attr("r", (this.NODEHEIGHT / 2))
290            .attr("cx", function(d) { return d.x;} )
291            .attr("cy",  function(d) { return d.y; })
292            .style("stroke", function(d) { return '#fafafa'; })
293            .style("stroke-width", function(d) { return '1.5px'; })
294            .style("fill", function(d) { return d.nodecolor; })
295            .style("cursor", function(d) { return 'pointer'; });
296
297        // nodes驟榊�繧呈ク。縺励ヮ繝シ繝峨ユ繧ュ繧ケ繝医�菴懈�
298        var tnode = svg.selectAll("text.node")
299            .data(json.nodes)
300            .enter().append("svg:text")
301            .attr("class", "tnode")
302            .attr("x", function(d) { return d.x; })
303            .attr("y", function(d) { return d.y; })
304            .text(function(d) { return d.name; })
305            .style("fill", function(d) { return '#000000'; })
306            .style("text-anchor", function(d) { return 'middle'; })
307            .style("pointer-events", "none");
308
309        // 繝ェ繝ウ繧ッ繝�く繧ケ繝医�菴懈�
310        var tlink = svg.selectAll("text.link")
311            .data(json.links)
312            .enter().append("svg:text")
313            .attr("class", "tlink")
314            .attr("x", function(d) { return (json.nodes[d.source].x + json.nodes[d.target].x) / 2; })
315            .attr("y", function(d) { return (json.nodes[d.source].y + json.nodes[d.target].y) / 2; })
316            .style("fill", function(d) { return '#000000'; })
317            .style("text-anchor", function(d) { return 'middle'; });
318
319        // nodes驟榊�繧呈ク。縺励ヮ繝シ繝峨ユ繧ュ繧ケ繝医�菴懈�
320        var tscore = svg.selectAll("text.score")
321            .data(json.nodes)
322            .enter().append("svg:text")
323            .attr("class", "tscore")
324            .attr("x", function(d) { return (d.x + scoreleftmargin); })
325            .attr("y", function(d) { return d.y; })
326            .text(function(d) { return d.score;
327            })
328            .style("fill", function(d) { return '#FF0000'; })
329            .style("text-anchor", function(d) { return 'middle'; })
330            .style("pointer-events", "none");
331
332        // 繝槭え繧ケ縺ョ蜍輔″繧ォ繧ヲ繝ウ繝医r繝ォ繝シ繝医↓謖√◆縺帙k
333        node.data()[0].mousemoved = 0;
334
335        // 繝弱�繝峨∈縺ョ繧ェ繝ウ繝槭え繧ケ縺ァ繝代せ謗「邏「縲√ヱ繧ケ荳ュ縺ョ繝ェ繝ウ繧ッ譁�ュ励r陦ィ遉コ
336        var self = this;
337        node.on("mouseover", function(d){
338
339            // 繝槭え繧ケ縺ョ蜍輔″繧ォ繧ヲ繝ウ繝医r繝ェ繧サ繝�ヨ
340            node.data()[0].mousemoved = 0;
341
342            // 陦ィ遉コ縺吶k繝代せ菫晏ュ倡畑驟榊�
343            var path = [];
344            // 繝��繝ォ繝√ャ繝励∈縺ョ蜷榊燕陦ィ遉コ逕ィ驟榊�
345            var pathname = [];
346
347            // 繝ォ繝シ繝医ヮ繝シ繝我サ・螟悶↑繧�
348            if(d.nodeid != 0){
349                // 縺セ縺壹が繝ウ繝槭え繧ケ縺輔l縺溘ヮ繝シ繝峨�id縺ィ蜷榊燕繧偵◎繧後◇繧瑚ソス蜉
350                path.push(d.nodeid);
351                pathname.push(d.name);
352
353                // 繝代せ謗「邏「
354                do{
355                    // 繝ェ繝ウ繧ッ縺ョ謨ー縺縺醍ケー繧願ソ斐@
356                    for(var i = 0; i < link.data().length; i++){
357                        // 迴セ蝨ィ縺ョ譛€蠕悟ーセ縺ォ郢九′繧九Μ繝ウ繧ッ縺後≠繧後�
358                        if(path[(path.length-1)] == link.data()[i].target){
359                            // 縺昴�繝ェ繝ウ繧ッ縺ョ繧ス繝シ繧ケ蛛エ繝弱�繝峨�id繧定ソス蜉
360                            path.push(link.data()[i].source);
361                            // 縺昴�繝ェ繝ウ繧ッ縺ョ蜷榊燕縺ィ繧ス繝シ繧ケ蛛エ繝弱�繝峨�蜷榊燕繧定ソス蜉
362                            pathname.push(link.data()[i].property);
363                            pathname.push(node.data()[link.data()[i].source].name);
364                        }
365                    }
366                // 繝ォ繝シ繝医ヮ繝シ繝峨↓霎ソ繧顔捩縺上∪縺ァ郢ー繧願ソ斐☆
367                }while(path[(path.length-1)] != 0);
368
369                // 譛ォ遶ッ繝弱�繝峨〒縺ェ縺�↑繧�
370                if(d.path == "notend"){
371                    // 繝��繝ォ繝√ャ繝励r髱櫁。ィ遉コ縺ォ
372                    document.getElementById("sparqlBuilderShowpath").style.display = "none";
373                }else{
374                    // 譛ォ遶ッ繝弱�繝峨↑繧峨ヤ繝シ繝ォ繝√ャ繝励�諠�ア繧呈峩譁ー
375                    var resultText = "<h3>Selected Path</h3>";
376                    // 繝代せ縺ョ蜷榊燕驟榊�蛻�セ後m縺九i郢ー繧願ソ斐@縺ェ縺後i
377                    for (var i = pathname.length;i > 0; i--){
378                        // 螂�焚逡ェ逶ョ�医ヮ繝シ繝峨�蜷榊燕�峨�螟ェ蟄励↓
379                        if(i % 2 == 1){
380                            resultText = resultText + "<span style=\"font-weight: bold;\">" + pathname[i - 1] + "</span><br><br>";
381                        // 蛛カ謨ー逡ェ逶ョ�医Μ繝ウ繧ッ縺ョ蜷榊燕�峨�縺昴�縺セ縺セ縺ァ陦ィ遉コ
382                        }else{
383                            resultText = resultText + pathname[i - 1] + "<br><br>";
384                        }
385                    }
386                    // 繝��繝ォ繝√ャ繝励�蜀�ョケ繧呈嶌縺肴鋤縺�
387                    document.getElementById("sparqlBuilderSelectpath").innerHTML=(resultText);
388                    if(svg.attr("width") == width){
389                        document.getElementById("sparqlBuilderShowpath").style.display = "block";
390                    }
391
392                    // 繧オ繝シ繝悶Ξ繝�ヨ縺ォ騾√j霑斐☆繝代せ繧ェ繝悶ず繧ァ繧ッ繝医r菫晏ュ�
393                    self.pathobj = d.path;
394
395                    // 繝��繝ォ繝√ャ繝苓。ィ遉コ譎ゅ�蠎ァ讓呻シ医が繝ウ繝槭え繧ケ縺輔l縺溘ヮ繝シ繝峨�讓ェ縺ォ繝懊ち繝ウ縺梧擂繧九h縺��鄂ョ��
396                    var xPosition = parseFloat(d3.select(this).attr("cx")) + parseFloat(d3.select(this).style("stroke-width")) + (self.NODEHEIGHT * 0.5);
397                    var yPosition = parseFloat(d3.select(this).attr("cy") - document.getElementById("sparqlBuilderShowpath").offsetHeight + 50 + document.getElementById("sparqlBuilderSetting").offsetHeight) + (self.NODEHEIGHT * 0.5);
398
399                    // 繝��繝ォ繝√ャ繝励′逕サ髱「螟悶↓蜃コ縺ェ縺�h縺�」懈ュ」
400                    if(xPosition < 0){
401                        xPosition = 0;
402                    }
403                    if(yPosition < 0){
404                        yPosition = 0;
405                    }
406
407                    // 逕滓�縺励◆蠎ァ讓吶↓繝��繝ォ繝√ャ繝励r陦ィ遉コ
408                    document.getElementById("sparqlBuilderShowpath").style.left = xPosition + "px"
409                    document.getElementById("sparqlBuilderShowpath").style.top = yPosition + "px"
410                }
411            // 繝ォ繝シ繝医ヮ繝シ繝峨□縺」縺溘↑繧�
412            }else{
413                // 繝��繝ォ繝√ャ繝励r髱櫁。ィ遉コ
414                document.getElementById("sparqlBuilderShowpath").style.display = "none";
415            }
416
417            // 繧ェ繝ウ繝槭え繧ケ縺輔l縺溘ヮ繝シ繝峨�鬮倥&縺ォ隕ェ繧貞粋繧上○繧九◆繧√↓蜷医o縺帙k鬮倥&繧剃ソ晏ュ�
418            var movey = d.y;
419
420            // 蜷�ヮ繝シ繝峨↓蟇セ縺�
421            node
422                // 霈ェ驛ュ邱壹�濶イ繧定ィュ螳�
423                .style("stroke", function(d){
424                    // 縺セ縺壹�閭梧勹濶イ�医ョ繝輔か繝ォ繝茨シ峨r謖�ョ�
425                    var strokecolor = "#fafafa";
426
427                    // 繝代せ蛻、螳壹�蜑榊�逅�
428                    // 陦ィ遉コ繝輔Λ繧ー縺系ow�亥燕蝗槭が繝ウ繝槭え繧ケ縺ァ蜍輔>縺ヲ縺�◆繝弱�繝会シ峨↑繧�
429                    if(d.view == "now"){
430                        // 繝弱�繝峨�陦ィ遉コ繝輔Λ繧ー繧地o縺ォ
431                        d.view = "no";
432                    }
433                    // 陦ィ遉コ繝輔Λ繧ー縺稽oved�医け繝ェ繝�け縺輔l蝗コ螳壽ク医∩縺縺悟燕蝗槫虚縺�※縺�◆繝弱�繝会シ峨↑繧�
434                    if(d.view == "moved"){
435                        // 陦ィ遉コ繝輔Λ繧ー繧団licked縺ォ謌サ縺�
436                        d.view = "clicked";
437                    }
438
439                    // 陦ィ遉コ繝輔Λ繧ー縺系o縺ョ繧ゅ�縺九i遒コ隱�
440                    if(d.view == "no"){
441                        // 繝代せ縺ョ繝弱�繝画焚縺縺醍ケー繧願ソ斐@縺ェ縺後i
442                        for(var n = 0; n < path.length; n++){
443                            // 繝代せ蜀�↓蜷ォ縺セ繧後k繝弱�繝峨□縺」縺溘i
444                            if(path[n] == d.nodeid){
445                                // 霈ェ驛ュ邱壹r襍、縺ォ
446                                strokecolor = "#ffaaaa";
447                                // 陦ィ遉コ繝輔Λ繧ー繧地ow�井サ雁屓蜍輔>縺溘ヮ繝シ繝会シ峨↓
448                                d.view = "now";
449                            }
450                        }
451                    // 蝗コ螳壽ク医∩繝弱�繝峨□縺」縺溘i
452                    }else if(d.view == "clicked"){
453                        // 縺セ縺壹�霈ェ驛ュ邱壹r襍、縺ォ
454                        strokecolor = "#ffaaaa";
455                        // 繝代せ蜀�↓蜷ォ縺セ繧後k繝弱�繝峨°繝√ぉ繝�け
456                        for(var n = 0; n < path.length; n++){
457                            if(path[n] == d.nodeid){
458                                // 蜷ォ縺セ繧後※縺�◆縺ェ繧我サ雁屓蜍輔°縺吶◆繧√ヵ繝ゥ繧ー繧知oved縺ォ
459                                d.view = "moved";
460                            }
461                        }
462                    }
463
464                    // 縺薙%縺セ縺ァ縺ァ蠕励i繧後◆霈ェ驛ュ邱壹�濶イ繧定ソ斐☆
465                    return strokecolor;
466                })
467                // 鬮倥&縺ョ蛟、
468                .attr("cy", function(d){
469                    // 繝弱�繝峨′莉雁屓繧ェ繝ウ繝槭え繧ケ縺輔l縺溘�縺セ縺溘�蝗コ螳壽ク医∩縺縺檎ァサ蜍輔ヵ繝ゥ繧ー繧偵▽縺代i繧後※縺�l縺ー
470                    if(d.view == "now" || d.view == "moved"){
471                        // 迴セ蝨ィ縺ョ鬮倥&繧貞叙蠕�
472                        var curty = d.y;
473                        // d.y縺ォ蟄舌ヮ繝シ繝峨�鬮倥&繧偵そ繝�ヨ
474                        d.y = movey;
475                        // 迴セ蝨ィ縺ョ鬮倥&繧定ソ斐☆�医%縺ョ譎らせ縺ァ縺ッ迴セ蝨ィ菴咲スョ縺ォ謠冗判縺輔l縲〉edraw髢「謨ー縺ァd.y縺ォ繧「繝九Γ繝シ繧キ繝ァ繝ウ縺輔l繧具シ�
476                        return curty;
477                    // 遘サ蜍募ッセ雎。縺ァ縺ェ縺�↑繧�
478                    }else{
479                        // 迴セ蝨ィ菴咲スョ繧偵◎縺ョ縺セ縺セ霑斐☆
480                        return d.y;
481                    }
482                });
483
484            // 蜷�Μ繝ウ繧ッ繝�く繧ケ繝医↓蟇セ縺�
485            tlink
486                // 繝�く繧ケ繝郁。ィ遉コ蛻、螳�
487                .text(function(d) {
488                    // 繝�ヵ繧ゥ繝ォ繝医〒遨コ繧偵そ繝�ヨ
489                    var linktext = "";
490                    // 陦ィ遉コ繝輔Λ繧ー縺系ow�亥燕蝗櫁。ィ遉コ縺輔l縺ヲ縺�◆繝ェ繝ウ繧ッ�峨↑繧�
491                    if(d.view == "now"){
492                        // 陦ィ遉コ繝輔Λ繧ー繧定ァ」髯、
493                        d.view = "no";
494                    }
495
496                    // 陦ィ遉コ繝輔Λ繧ー縺系o縺ェ繧�
497                    if(d.view == "no"){
498                        // 繝代せ縺ョ繝弱�繝画焚蛻�ケー繧願ソ斐@
499                        for(var t = 0; t < path.length; t++){
500                            // 閾ェ霄ォ縺後◎縺ョ繝弱�繝峨∈謗・邯壹@縺ヲ縺�k繝ェ繝ウ繧ッ�医°縺、縺昴�繝弱�繝峨′謚倥j縺溘◆縺セ繧後※縺�↑縺代l縺ー��
501                            if(path[t] == d.target && node.data()[d.target].view != "hide"){
502                                // 繝ェ繝ウ繧ッ繝�く繧ケ繝医↓繝励Ο繝代ユ繧」縺ョ蛟、繧偵そ繝�ヨ
503                                linktext = d.property
504                                // 陦ィ遉コ繝輔Λ繧ー縺ォnow繧偵そ繝�ヨ
505                                d.view = "now";
506                            }
507                        }
508                    // 陦ィ遉コ繝輔Λ繧ー縺掲ix�医け繝ェ繝�け縺輔l縺溘ヱ繧ケ縺ョ繝ェ繝ウ繧ッ�峨↑繧峨��医°縺、郢九′繧句�縺ョ繝弱�繝峨′謚倥j縺溘◆縺セ繧後※縺�↑縺代l縺ー��
509                    }else if(d.view == "fix" && node.data()[d.target].view != "hide"){
510                        // 繝ェ繝ウ繧ッ繝�く繧ケ繝医↓繝励Ο繝代ユ繧」縺ョ蛟、繧偵そ繝�ヨ
511                        linktext = d.property
512                    }
513                    // 縺薙%縺セ縺ァ縺ァ縺ァ縺阪◆繝ェ繝ウ繧ッ繝�く繧ケ繝医r霑斐☆
514                    return linktext;
515                });
516
517            // 蜷�Μ繝ウ繧ッ縺ォ蟇セ縺�
518            link
519                // 邱壹�濶イ蛻、螳�
520                .style("stroke", function(d){
521                    // 陦ィ遉コ繝輔Λ繧ー縺系o縺ェ繧峨�
522                    if(d.view == "no"){
523                        // 濶イ繧偵ョ繝輔か繝ォ繝医↓
524                        return "#999";
525                    // 縺昴l莉・螟厄シ亥崋螳壹d繧ェ繝ウ繝槭え繧ケ縺輔l縺溘ヱ繧ケ縺ォ蜷ォ縺セ繧後k�峨↑繧�
526                    }else{
527                        // 濶イ繧定オ、縺ォ
528                        return "#ffaaaa";
529                    }
530                });
531
532            // 縺薙%縺セ縺ァ縺ョ險ュ螳壹r蜈�↓蜀肴緒逕サ
533            redraw();
534
535        // 繝弱�繝峨∈縺ョ繧ッ繝ェ繝�け縺ァ驕ク謚槫崋螳壼喧�亥所縺ウ謚倥j逡ウ縺ソ蜃ヲ逅�シ�
536        }).on("click", function(d){
537
538            // 蜷�ヮ繝シ繝峨↓蟇セ縺�
539            node
540                // 霈ェ驛ュ邱壹�蛻、螳�
541                .style("stroke", function(d) {
542                    // 繝�ヵ繧ゥ繝ォ繝医�濶イ繧偵そ繝�ヨ
543                    var strokecolor = "#fafafa"
544                    // 陦ィ遉コ繝輔Λ繧ー縺後が繝ウ繝槭え繧ケ荳ュ繝サ蝗コ螳壻クュ繝サ遘サ蜍穂クュ�磯∈謚槭&繧後※縺�k繝弱�繝会シ峨↑繧峨�
545                    if(d.view == "now" || d.view == "clicked" || d.view == "moved"){
546                        // 濶イ繧定オ、縺ォ
547                        strokecolor = "#ffaaaa"
548                        // 陦ィ遉コ繝輔Λ繧ー繧貞崋螳壻クュ縺ォ
549                        d.view = "clicked";
550                    }
551                    // 縺薙%縺セ縺ァ縺ァ縺ァ縺阪◆濶イ繧定ソ斐☆
552                    return strokecolor;
553                });
554
555            // 蜷�Μ繝ウ繧ッ縺ォ蟇セ縺�
556            tlink
557                // 繝�く繧ケ繝郁。ィ遉コ蛻、螳�
558                .text(function(d) {
559                    // 繝�ヵ繧ゥ繝ォ繝医〒遨コ縺ォ
560                    var linktext = "";
561                    // 陦ィ遉コ繝輔Λ繧ー縺檎樟蝨ィ陦ィ遉コ荳ュ縺セ縺溘�蝗コ螳壼喧貂医∩縺ェ繧峨��医°縺、謚倥j逡ウ縺ソ荳ュ縺ァ縺ェ縺代l縺ー��
562                    if((d.view == "now" || d.view == "fix") && (node.data()[d.target].view != "hide")){
563                        // 繝ェ繝ウ繧ッ繝�く繧ケ繝医↓繝励Ο繝代ユ繧」縺ョ蛟、繧偵そ繝�ヨ
564                        linktext = d.property
565                        // 陦ィ遉コ繝輔Λ繧ー繧貞崋螳壻クュ縺ォ
566                        d.view = "fix";
567                    }
568                    // 繝�く繧ケ繝医r霑斐☆
569                    return linktext;
570                });
571
572            // 縺薙%縺セ縺ァ縺ョ蜃ヲ逅�オ先棡繧貞�縺ォ蜀肴緒逕サ
573            redraw();
574
575        });
576
577        // 蜀肴緒逕サ髢「謨ー
578        var redraw = function (duration){
579
580            // 縺九¢繧区凾髢薙′譛ェ謖�ョ壹↑繧峨�
581            if(duration == undefined){
582                // 0.5遘偵°縺代※繧「繝九Γ繝シ繧キ繝ァ繝ウ
583                duration = 500;
584            }
585
586            // 蜷�Μ繝ウ繧ッ縺ォ縺、縺�※險ュ螳壹&繧後◆菴咲スョ縺ォ蜀肴緒逕サ
587            link
588                .transition()
589                .duration(duration)
590                .attr("x1", function(d) {return node.data()[d.source].x;})
591                .attr("y1", function(d) {return node.data()[d.source].y;})
592                .attr("x2", function(d) {return node.data()[d.target].x;})
593                .attr("y2", function(d) {return node.data()[d.target].y;});
594
595            // 蜷�ヮ繝シ繝峨↓縺、縺�※險ュ螳壹&繧後◆菴咲スョ縺ォ蜀肴緒逕サ�医°縺、謚倥j縺溘◆縺セ繧御クュ縺ョ蝣エ蜷医�謠冗判蛻�イ仙�逅�シ�
596            node
597                .transition()
598                .duration(duration)
599                .attr("cx", function(d) {return d.x;})
600                .attr("cy", function(d) {return d.y;});
601
602            // 蜷�ヮ繝シ繝峨ユ繧ュ繧ケ繝医↓縺、縺�※險ュ螳壹&繧後◆菴咲スョ縺ォ蜀肴緒逕サ縲√ユ繧ュ繧ケ繝域緒逕サ菴咲スョ繧剃ク贋ク九↓謖ッ繧具シ医°縺、謚倥j縺溘◆縺セ繧御クュ縺ョ蝣エ蜷医�謠冗判蛻�イ仙�逅�シ�
603            tnode
604            .transition()
605            .duration(duration)
606            .attr("x", function(d) {return d.x;})
607            .attr("y", function(d) {
608                // 繝�ヵ繧ゥ繝ォ繝医〒蟆代@荳九£繧�
609                var updown = (self.NODEHEIGHT * 0.4);
610                // 螂�焚逡ェ逶ョ縺ョ豺ア縺輔↑繧牙ー代@荳翫£繧�
611                if(d.group % 2 == 1){
612                    updown = -(self.NODEHEIGHT * 0.2);
613                }
614                // 縺昴�蛟、繧帝ォ倥&縺ォ霑斐☆縺薙→縺ァ繝�く繧ケ繝域緒逕サ菴咲スョ縺御コ偵>驕輔>縺ォ縺ェ繧�
615                return d.y + updown;
616            });
617
618            // 蜷�Μ繝ウ繧ッ繝�く繧ケ繝医↓縺、縺�※險ュ螳壹&繧後◆菴咲スョ縺ォ蜀肴緒逕サ
619            tlink
620                .transition()
621                .duration(duration)
622                .attr("x", function(d) {return (node.data()[d.source].x + node.data()[d.target].x) / 2;})
623                .attr("y", function(d) {return ((node.data()[d.source].y + node.data()[d.target].y) / 2) + 5;});
624
625        };
626
627        // 閭梧勹驛ィ蛻�′繧ッ繝ェ繝�け縺輔l縺溘i陦ィ遉コ縺ョ蝗コ螳壼喧繧定ァ」髯、
628        bg.on("click", function() {
629            // 繝��繝ォ繝√ャ繝励r髱櫁。ィ遉コ
630            document.getElementById("sparqlBuilderShowpath").style.display = "none";
631            d3.selectAll(".node").style("stroke-width", function(d) { return '1.5px'; });
632            d3.selectAll(".node").style("stroke", function(d) { return '#ffffff'; });
633
634            // 蜷�ヮ繝シ繝峨�霈ェ驛ュ邱壹�濶イ繧偵ョ繝輔か繝ォ繝医↓
635            node
636                .style("stroke", function(d){
637                    if(d.view != "hide"){
638                        d.view = "no";
639                    }
640                    return "#fafafa";
641                });
642
643            // 繝ェ繝ウ繧ッ繝�く繧ケ繝医r蜈ィ縺ヲ遨コ縺ォ
644            tlink
645                .text(function(d) {
646                    d.view = "no";
647                    return "";
648                });
649
650            // 繝ェ繝ウ繧ッ縺ョ濶イ繧貞�縺ヲ繝�ヵ繧ゥ繝ォ繝医↓
651            link
652                .style("stroke", function(d){
653                    return "#999";
654                });
655
656            if(svg.attr("width") == width){
657                    svg.attr("width", (width / 5))
658                    .attr("height", (width * 9 / 16 / 5))
659                    .attr("viewBox", "0 0 " + width + " " + (width * 9 / 16));
660            }else{
661                    svg.attr("width", width)
662                    .attr("height", height)
663                    .attr("viewBox", "0 0 " + width + " " + height);
664            }
665
666        });
667
668        // 閭梧勹荳翫〒繝槭え繧ケ縺悟虚縺上#縺ィ縺ォ
669        bg.on("mousemove", function(){
670            // MOUSEMOVED繧定ソス蜉�医ヮ繝シ繝峨↓繧ェ繝ウ繝槭え繧ケ縺輔l繧句コヲ縺ォ繧ォ繧ヲ繝ウ繝医Μ繧サ繝�ヨ��
671            node.data()[0].mousemoved++;
672            // 30繧定カ�∴縺溘i
673            if(node.data()[0].mousemoved > 30){
674                // 繝��繝ォ繝√ャ繝励r髱櫁。ィ遉コ縺ォ縺励※繧ォ繧ヲ繝ウ繝医Μ繧サ繝�ヨ
675                document.getElementById("sparqlBuilderShowpath").style.display = "none";
676                node.data()[0].mousemoved = 0;
677            }
678        });
679
680        // 蛻晏屓縺ョ縺ソduration繧�縺ィ謖�ョ壹@蜀肴緒逕サ�医い繝九Γ繝シ繧キ繝ァ繝ウ縺ェ縺暦シ�
681        redraw(0);
682    }
683};
684
685// 繝��繧ソ縺ョ菴懈�繝。繧ス繝�ラ
686SPARQLBuilderDrawGraph.prototype.make_data = function(tdepth, ret, parent, depth){
687    // ret縺梧悴螳夂セゥ縺ェ繧峨�螳夂セゥ縺励※莉」蜈・
688    if (ret == undefined){
689        ret = new Object();
690        ret['nodes'] = new Array();
691        ret['links'] = new Array();
692    }
693
694    this.PATHNUM = 0;
695    this.MAXDEPTH = 0;
696    this.TREESPACE = 0;
697    this.NODEHEIGHT = 50;
698    this.DRAWHEIGHT = this.NODEHEIGHT;
699
700    var viewnum;
701
702    var obj = this.jsontext;
703
704    document.getElementById("sparqlBuilderResultmessage").style.color = "black";
705    document.getElementById("sparqlBuilderResultmessage").style.fontWeight = "normal";
706
707    document.getElementById("sparqlBuilderPlural").innerHTML = "s";
708
709    if(obj.length == 0){
710        document.getElementById("sparqlBuilderResultmessage").style.color = "red";
711        document.getElementById("sparqlBuilderResultmessage").style.fontWeight = "bold";
712        document.getElementById("sparqlBuilderPlural").innerHTML = "";
713    }else if(obj.length == 1){
714        document.getElementById("sparqlBuilderPlural").innerHTML = "";
715    }
716
717    if(obj.length <= 10){
718        viewnum = obj.length;
719        document.getElementById("sparqlBuilderViewall").style.display = "none";
720    }else if(this.pathlimit == 10){
721        viewnum = 10;
722        document.getElementById("sparqlBuilderViewall").style.display = "block";
723    }else{
724        viewnum = obj.length;
725        document.getElementById("sparqlBuilderViewall").style.display = "none";
726    }
727
728    document.getElementById("sparqlBuilderPathnum").innerHTML = obj.length;
729    document.getElementById("sparqlBuilderResultmessage").style.display = "block";
730
731    // obj繝医ャ繝鈴嚴螻、縺ョ謨ー縺縺醍ケー繧願ソ斐@縺ェ縺後i
732    for(var i = 0; i < viewnum; i++){
733        if(i == 0){
734            // 蛻晏屓縺縺代Ν繝シ繝医ヮ繝シ繝峨r繝励ャ繧キ繝・
735            ret['nodes'].push({'name': obj[0]['label'], 'uri': obj[0]['startClass'], 'group': 0, 'x':50, 'y':50, 'nodeid':ret['nodes'].length, 'view' : 'no', 'path': 'notend', 'nodecolor': '#d0a36a'});
736        }
737        // 蜈医↓source縺ォ0�医Ν繝シ繝茨シ峨r莉」蜈・
738        var source = 0;
739        // 蜈ア騾壹Ν繝シ繝亥愛螳壹rtrue縺ォ
740        var isCommon = true;
741
742        var score = obj[i]['score'];
743
744        // classLinks縺ョ謨ー縺縺醍ケー繧願ソ斐@縺ェ縺後i
745        for(var j = 0;j < obj[i]['classLinks'].length; j++){
746
747            // 繝ェ繝ウ繧ッ縺ョ蜷榊燕繧旦RL譛ォ蟆セ縺九i蜿門セ�
748            var propertytext = obj[i]['classLinks'][j]['predicate'];
749            var propertysplit1 = propertytext.split("/");
750            var propertysplit2 = propertysplit1[propertysplit1.length - 1];
751            var propertysplit3 = propertysplit2.split("#");
752            propertytext = propertysplit3[propertysplit3.length - 1];
753
754            if(this.MAXDEPTH < j+1){
755                this.MAXDEPTH = j+1;
756            }
757            // 縺薙%縺セ縺ァ蜈ア騾壹Ν繝シ繝医↑繧�
758            if(isCommon){
759                // 莉雁屓繧ょ�騾壹°遒コ隱阪☆繧九◆繧√�繝輔Λ繧ー
760                var isCommonNow = false;
761                // nodes驟榊�縺ォ蜷後§linkedClass縺梧里縺ォ縺ゅk縺狗「コ隱�
762                var targets = [];
763                for(var k = 0; k < ret['nodes'].length; k++){
764                    // 蜷碁嚴螻、縺九▽蜷後§蜷榊燕縺ョ繧ゅ�縺後≠縺」縺溘itargets驟榊�縺ォ逡ェ蜿キ繧定ソス蜉
765                    if(ret['nodes'][k]['group'] == (j+1) && obj[i]['classLinks'][j]['linkedClass'] == ret['nodes'][k]['uri']){
766                        targets.push(k);
767                    }
768                }
769
770                // 譌「縺ォ縺ゅ▲縺溷エ蜷医�links驟榊�縺ォ蜷後§link縺悟ュ伜惠縺吶k縺狗「コ隱�
771                if(targets.length != 0){
772                    // 蜈医⊇縺ゥ隕九▽縺代◆targets縺ョ謨ー縺縺醍ケー繧願ソ斐@縺ェ縺後i
773                    for(var l = 0; l <targets.length; l++){
774                        // links驟榊�縺ォ蜈ィ縺丞酔縺俶擅莉カ縺ョ繧ゅ�縺後≠繧九°遒コ隱�
775                        for(var m = 0; m < ret['links'].length; m++){
776                            // 縺ゅ▲縺溷エ蜷井サ雁屓縺ョ繧ゅ�縺ッ霑ス蜉縺帙★source繧呈峩譁ー縺励※谺。縺ク
777                            if(ret['links'][m]['source'] == source && ret['links'][m]['target'] == targets[l] && ret['links'][m]['uri'] == obj[i]['classLinks'][j]['predicate'] && !isCommonNow){
778                                // 蜈ア騾壹Ν繝シ繝医ヵ繝ゥ繧ー繧偵が繝ウ
779                                isCommonNow = true;
780                                source = targets[l];
781                            }
782                        }
783                    }
784
785                    // 蜷дarget繧堤「コ隱阪@縺ヲ蜈ア騾壹Ν繝シ繝医〒縺ッ縺ェ縺九▲縺溷エ蜷域眠隕剰ソス蜉
786                    if(!isCommonNow){
787                        isCommon = false;
788                        ret['nodes'].push({'name': obj[i]['classLinks'][j]['label'], 'uri': obj[i]['classLinks'][j]['linkedClass'], 'group': (j+1), 'x':0, 'y':0, 'dy':0, 'nodeid':ret['nodes'].length, 'view' : 'no', 'path': 'notend', 'nodecolor': '#cccccc'});
789                        ret['links'].push({'source':source, 'target':ret['nodes'].length - 1, 'value':5, 'property': propertytext, 'uri': obj[i]['classLinks'][j]['predicate'], 'view' : 'no'});
790                        source = ret['nodes'].length - 1;
791                    }
792
793                // 縺ェ縺九▲縺溷エ蜷医�蛻・譚。莉カ縺ェ縺ョ縺ァ譁ー隕剰ソス蜉縺励※谺。縺ク
794                }else{
795
796                    isCommon = false;
797                    ret['nodes'].push({'name': obj[i]['classLinks'][j]['label'], 'uri': obj[i]['classLinks'][j]['linkedClass'], 'group': (j+1), 'x':0, 'y':0, 'dy':0, 'nodeid':ret['nodes'].length, 'view' : 'no', 'path': 'notend', 'nodecolor': '#cccccc'});
798                    ret['links'].push({'source':source, 'target':ret['nodes'].length - 1, 'value':5, 'property': propertytext, 'uri': obj[i]['classLinks'][j]['predicate'], 'view' : 'no'});
799                    source = ret['nodes'].length - 1;
800                }
801            // 譌「縺ォ蜈ア騾壹Ν繝シ繝医〒縺ェ縺�↑繧画眠隕剰ソス蜉縺励※谺。縺ク
802            }else{
803                ret['nodes'].push({'name': obj[i]['classLinks'][j]['label'], 'uri': obj[i]['classLinks'][j]['linkedClass'], 'group': (j+1), 'x':0, 'y':0, 'dy':0, 'nodeid':ret['nodes'].length, 'view' : 'no', 'path': 'notend', 'nodecolor': '#cccccc'});
804                ret['links'].push({'source':source, 'target':ret['nodes'].length - 1, 'value':5, 'property': propertytext, 'uri': obj[i]['classLinks'][j]['predicate'], 'view' : 'no'});
805                source = ret['nodes'].length - 1;
806            }
807
808        }
809        ret['nodes'][ret['nodes'].length - 1]['path'] = obj[i];
810        ret['nodes'][ret['nodes'].length - 1]['score'] = score;
811        ret['nodes'][ret['nodes'].length - 1]['nodecolor'] = '#8cddc0';
812        this.PATHNUM++;
813    }
814    this.TREESPACE = (window.innerWidth - 200) / (this.MAXDEPTH + 1);
815
816    // 縺ァ縺阪◆邨先棡繧定ソ斐☆
817    return ret;
818};
819
820// 逕滓�縺輔l縺溘ョ繝シ繧ソ縺ョ螳滄圀縺ョ繝ュ繧ア繝シ繧キ繝ァ繝ウ繧定ィ育ョ励☆繧九Γ繧ス繝�ラ�亥�蝗槭�myNodeIndex縺�縲]odes縺ォ逕滓�縺輔l縺殤odes驟榊�縲〕inks縺ォ逕滓�縺輔l縺殕inks驟榊�縺梧ク。縺輔l繧具シ�
821SPARQLBuilderDrawGraph.prototype.set_map_location = function(myNodeIndex, nodes, links, depth, fromAngle, toAngle){
822
823    // depth縺梧悴螳夂セゥ縺ェ繧峨�0繧偵そ繝�ヨ
824    if (depth == undefined){
825        depth = 0;
826    }
827
828    // 蜷�ィョ蛻晄悄蛹�
829    var children = undefined;
830    var parent = undefined;
831    var parentsChildren = undefined;
832
833    // links驟榊�縺ョ謨ー縺縺醍ケー繧願ソ斐@縺ェ縺後i
834    for (var i=0; i<links.length; i++){
835        // 縺昴�links縺ョtarget縺稽yNodeIndex縺ェ繧英arent繧偵そ繝�ヨ
836        if (links[i].target == myNodeIndex){
837            parent = links[i].source;
838        }
839    }
840
841    // parent縺瑚ヲ九▽縺九▲縺ヲ縺�◆縺ェ繧峨�
842    if (parent != undefined){
843        // parent縺ィlinks繧呈ク。縺揚et_children繝。繧ス繝�ラ繧貞ョ溯。�
844        parentsChildren = this.get_children(parent, links);
845    }
846
847    if(myNodeIndex != 0){
848        this.DRAWHEIGHT += (this.NODEHEIGHT * 1.5);
849        var x = (depth * this.TREESPACE) + (this.TREESPACE / 3);
850        var y = this.DRAWHEIGHT;
851        nodes[myNodeIndex].x = x;
852        nodes[myNodeIndex].y = y;
853    }else{
854        var x = this.TREESPACE / 2;
855        var y = (this.NODEHEIGHT * 1.5) * ((this.PATHNUM - 1) / 2) + this.NODEHEIGHT;
856        nodes[myNodeIndex].x = x;
857        nodes[myNodeIndex].y = y;
858    }
859
860    children = this.get_children(myNodeIndex, links);
861
862    for (var i=0; i<children.length; i++){
863        if(i == 0){
864            this.DRAWHEIGHT -= (this.NODEHEIGHT * 1.5);
865        }
866        var child = children[i];
867        this.set_map_location(child, nodes, links, depth+1, fromAngle + ((toAngle - fromAngle) / children.length) * i, fromAngle + ((toAngle - fromAngle) / children.length) * (i+1));
868    }
869
870};
871
872// 謖�ョ壹&繧後◆隕ェ縺梧戟縺、蟄舌r霑斐☆
873SPARQLBuilderDrawGraph.prototype.get_children = function(index, links){
874    var children = new Array();
875    // links縺ョ謨ー縺縺醍「コ隱阪@縺ェ縺後i
876    for (var i=0; i<links.length; i++){
877        // 隕ェ縺梧ク。縺輔l縺溯ヲェ縺ィ荳€閾エ縺吶k譎ゅ�蟄舌r霑ス蜉
878        if (links[i].source == index){
879            children.push(links[i].target);
880        }
881    }
882    return children;
883};
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。