mirror of https://github.com/gsi-upm/senpy
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
224 lines
6.4 KiB
JavaScript
224 lines
6.4 KiB
JavaScript
ns = {
|
|
'http://www.gsi.dit.upm.es/ontologies/marl/ns#': 'marl',
|
|
'http://www.gsi.dit.upm.es/ontologies/onyx/ns#': 'onyx',
|
|
'http://www.gsi.dit.upm.es/ontologies/senpy/ns#': 'onyx',
|
|
'http://www.gsi.upm.es/onto/senpy/ns#': 'senpy',
|
|
'http://www.w3.org/ns/prov#': 'prov',
|
|
'http://persistence.uni-leipzig.org/nlp2rdf/ontologies/nif-core#': 'nif'
|
|
}
|
|
|
|
mappings = {
|
|
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type': 'a',
|
|
}
|
|
|
|
function load_graph(){
|
|
|
|
function filterNodesById(nodes,id){
|
|
return nodes.filter(function(n) { return n.id === id; });
|
|
}
|
|
|
|
function filterNodesByType(nodes,value){
|
|
return nodes.filter(function(n) { return n.type === value; });
|
|
}
|
|
|
|
function triplesToGraph(triples){
|
|
|
|
svg.html("");
|
|
//Graph
|
|
var graph={nodes:[], links:[], triples: []};
|
|
|
|
triples = triples.filter(t=>t!=null).map(t => {
|
|
return t.map(e =>{
|
|
ids = e.match(/^\<(.*)\>/)
|
|
if (! ids ) {
|
|
return e
|
|
|
|
}
|
|
id = ids[1]
|
|
for (ix in ns) {
|
|
id = id.replace(ix, ns[ix] + ':')
|
|
}
|
|
if (! (id in mappings)) {
|
|
console.log(id, id in mappings)
|
|
return id
|
|
}
|
|
return mappings[id]
|
|
})
|
|
})
|
|
|
|
//Initial Graph from triples
|
|
triples.forEach(function(triple){
|
|
if (triple == null) {
|
|
return
|
|
}
|
|
var subjId = triple[0];
|
|
var predId = triple[1];
|
|
var objId = triple[2];
|
|
|
|
|
|
|
|
var subjNode = filterNodesById(graph.nodes, subjId)[0];
|
|
var objNode = filterNodesById(graph.nodes, objId)[0];
|
|
|
|
if(subjNode==null){
|
|
subjNode = {id:subjId, label:subjId, weight:1, type:"node"};
|
|
graph.nodes.push(subjNode);
|
|
}
|
|
|
|
if(objNode==null){
|
|
objNode = {id:objId, label:objId, weight:1, type:"node"};
|
|
graph.nodes.push(objNode);
|
|
}
|
|
|
|
var predNode = {id:predId, label:predId, weight:1, type:"pred"} ;
|
|
graph.nodes.push(predNode);
|
|
|
|
var blankLabel = "";
|
|
|
|
graph.links.push({source:subjNode, target:predNode, predicate:blankLabel, weight:1});
|
|
graph.links.push({source:predNode, target:objNode, predicate:blankLabel, weight:1});
|
|
graph.triples.push({s:subjNode, p:predNode, o:objNode});
|
|
|
|
|
|
});
|
|
|
|
return graph;
|
|
}
|
|
|
|
|
|
function update(graph){
|
|
|
|
|
|
// ==================== Add Marker ====================
|
|
svg.append("svg:defs").selectAll("marker")
|
|
.data(["end"])
|
|
.enter().append("svg:marker")
|
|
.attr("id", String)
|
|
.attr("viewBox", "0 -5 10 10")
|
|
.attr("refX", 30)
|
|
.attr("refY", -0.5)
|
|
.attr("markerWidth", 6)
|
|
.attr("markerHeight", 6)
|
|
.attr("orient", "auto")
|
|
.append("svg:polyline")
|
|
.attr("points", "0,-5 10,0 0,5")
|
|
;
|
|
|
|
|
|
// ==================== Add Links ====================
|
|
var links = svg.selectAll(".link")
|
|
.data(graph.triples)
|
|
.enter()
|
|
.append("path")
|
|
.attr("marker-end", "url(#end)")
|
|
.attr("class", "link")
|
|
;
|
|
;//links
|
|
|
|
// ==================== Add Link Names =====================
|
|
var linkTexts = svg.selectAll(".link-text")
|
|
.data(graph.triples)
|
|
.enter()
|
|
.append("text")
|
|
.attr("class", "link-text")
|
|
.text( function (d) { return d.p.label; })
|
|
;
|
|
|
|
|
|
//linkTexts.append("title")
|
|
// .text(function(d) { return d.predicate; });
|
|
|
|
// ==================== Add Link Names =====================
|
|
var nodeTexts = svg.selectAll(".node-text")
|
|
.data(filterNodesByType(graph.nodes, "node"))
|
|
.enter()
|
|
.append("text")
|
|
.attr("class", "node-text")
|
|
.text( function (d) { return d.label; })
|
|
;
|
|
//nodeTexts.append("title")
|
|
// .text(function(d) { return d.label; });
|
|
|
|
// ==================== Add Node =====================
|
|
var nodes = svg.selectAll(".node")
|
|
.data(filterNodesByType(graph.nodes, "node"))
|
|
.enter()
|
|
.append("circle")
|
|
.attr("class", "node")
|
|
.attr("r",8)
|
|
.call(force.drag)
|
|
;//nodes
|
|
|
|
// ==================== Add Predicate =====================
|
|
/*var preds = svg.selectAll(".node")
|
|
.data(graph.preds)
|
|
.enter()
|
|
.append("circle")
|
|
.attr("class", "node")
|
|
.attr("r",1)
|
|
//.call(force.drag)*/
|
|
;//nodes
|
|
|
|
// ==================== Force ====================
|
|
force.on("tick", function() {
|
|
nodes
|
|
.attr("cx", function(d){ return d.x; })
|
|
.attr("cy", function(d){ return d.y; })
|
|
;
|
|
|
|
links
|
|
.attr("d", function(d) {
|
|
return "M" + d.s.x + "," + d.s.y
|
|
+ "S" + d.p.x + "," + d.p.y
|
|
+ " " + d.o.x + "," + d.o.y;
|
|
})
|
|
;
|
|
|
|
nodeTexts
|
|
.attr("x", function(d) { return d.x + 12 ; })
|
|
.attr("y", function(d) { return d.y + 3; })
|
|
;
|
|
|
|
|
|
linkTexts
|
|
.attr("x", function(d) { return 4 + (d.s.x + d.p.x + d.o.x)/3 ; })
|
|
.attr("y", function(d) { return 4 + (d.s.y + d.p.y + d.o.y)/3 ; })
|
|
; });
|
|
|
|
// ==================== Run ====================
|
|
force
|
|
.nodes(graph.nodes)
|
|
.links(graph.links)
|
|
.charge(-500)
|
|
.linkDistance(50)
|
|
.start()
|
|
;
|
|
}
|
|
|
|
get_result('ntriples').done(resp => {
|
|
triples = resp.split('\n').map(line => line.match(/[^" ][^ ]*|\"[^"]+\"[^ ]*/g))
|
|
|
|
console.log(triples);
|
|
|
|
|
|
var graph = triplesToGraph(triples);
|
|
console.log(graph);
|
|
|
|
update(graph);
|
|
}).fail(resp => {
|
|
alert('Could not get a response.');
|
|
});
|
|
|
|
d3.select('#svg-body').selectAll("*").remove();
|
|
var svg = d3.select("#svg-body").append("svg")
|
|
.attr("width", width)
|
|
.attr("height", height)
|
|
;
|
|
|
|
var height = 600;
|
|
var width = $('.tab-content').width();
|
|
|
|
console.log('Graph with', width, height);
|
|
var force = d3.layout.force().size([width, height]);
|
|
}
|