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.
senpy/senpy/static/js/nodes.js

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]);
}