blob: 86cef0d62f338c02960f8c2426a6d2f756bf030a [file] [log] [blame]
@(jsonData: String)
@import helper._
@scripts = {
<link rel="stylesheet" href='@routes.Assets.at("stylesheets/vis.css")'>
<style type="text/css">
html, body {
font: 10pt arial;
}
#mynetwork {
width: 600px;
height: 600px;
border: 1px solid lightgray;
}
#loadingBar {
position:absolute;
width: 610px;
height: 610px;
background-color:rgba(200,200,200,0.8);
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-ms-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
transition: all 0.5s ease;
opacity:1;
}
#wrapper {
position:relative;
width:900px;
height:900px;
}
#text {
position:absolute;
top:0px;
left:530px;
width:30px;
height:50px;
margin:auto auto auto auto;
font-size:22px;
color: #000000;
}
div.outerBorder {
position:relative;
top:300px;
width:600px;
height:44px;
margin:auto auto auto auto;
border:8px solid rgba(0,0,0,0.1);
background: rgb(252,252,252); /* Old browsers */
background: -moz-linear-gradient(top, rgba(252,252,252,1) 0%, rgba(237,237,237,1) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(252,252,252,1)), color-stop(100%,rgba(237,237,237,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* IE10+ */
background: linear-gradient(to bottom, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfcfc', endColorstr='#ededed',GradientType=0 ); /* IE6-9 */
border-radius:72px;
box-shadow: 0px 0px 10px rgba(0,0,0,0.2);
}
#border {
position:absolute;
top:2px;
left:2px;
width:500px;
height:23px;
margin:auto auto auto auto;
box-shadow: 0px 0px 4px rgba(0,0,0,0.2);
border-radius:10px;
}
#bar {
position:absolute;
width:10px;
height:20px;
margin:auto auto auto auto;
border-radius:11px;
border:2px solid rgba(30,30,30,0.05);
background: rgb(153, 255, 255); /* Old browsers */
box-shadow: 2px 2px 4px rgba(0,0,0,0.4);
}
#config {
width: 400px;
height: 600px;
}
#config input {
display: inline-block;
}
#config input.vis-configuration.vis-config-rangeinput {
height: 15px;
}
#config button, input, select, textarea {
line-height: 100%;
}
</style>
<script type="text/javascript" src='@routes.Assets.at("javascripts/exampleUtil.js")'></script>
<script type="text/javascript" src='@routes.Assets.at("javascripts/vis.js")'></script>
<script type="text/javascript">
var responseJson = null;
var jsonString = null;
$(document).ready(function() {
$("#panel").hide();
$("#config").hide();
$("#basicConf").hide();
jsonString = $('#jsonData').text();
draw();
})
var p1 = "User";
var p2 = "Dataset";
var p3 = "Service";
var degrees = 1;// graph level setting
var nodes = null;
var edges = null;
var network = null;
var allNodes;
var allEdges;
var highlightActive = false;
var nodesDataset = new vis.DataSet(nodes);
var edgesDataset = new vis.DataSet(edges);
var visAdvancedConfig = 1;
var visBasicConfig = 1;
function getParameters() {
var temp1 = document.getElementById("paramCombination").value;
var temp2 = temp1.split(" ");
p1 = temp2[0];
p2 = temp2[1];
p3 = temp2[2];
var parameters = {
param1:p1,
param2:p2,
param3:p3
}
$.ajax({
url: "/getSpecifiedKnowledgeGraph",
type: "POST",
contentType: "application/json",
data: JSON.stringify(parameters),
dataType: "text"
}).done(function(data1) {
console.log("success");
jsonString = data1;
draw();
}).fail(function(xhr, textStatus, errorThrown) {
console.log("error!");
console.log(xhr);
console.log(textStatus);
console.log(errorThrown);
})
}
function showBasicConfig() {
if (visBasicConfig == 0) {
$("#basicConf").hide();
visBasicConfig =1;
}else {
$("#basicConf").show();
visBasicConfig =0;
}
}
function showAdvancedConfig() {
if (visAdvancedConfig == 0) {
$("#config").hide();
visAdvancedConfig =1;
}else {
$("#config").show();
visAdvancedConfig =0;
}
}
function setGraphLevel() {
degrees = $("#graphLevel").val();
//alert(degrees);
}
function draw() {
console.log("draw");
// create people.
// value corresponds with the age of the person
var test = jsonString;
//test = JSON.stringify(test);
console.log("test: " + test);
test = JSON.parse(test);
var nodes = test.nodes;
console.log("nodes: " + nodes);
var edges = test.edges;
console.log("edges: " + edges);
nodesDataset = new vis.DataSet(nodes);
edgesDataset = new vis.DataSet(edges);
// Instantiate our network object.
var container = document.getElementById('mynetwork');
var data = {
nodes: nodesDataset,
edges: edgesDataset
};
var options = {
nodes: {
color: {
highlight: {
border: "rgba(255,0,255,0.3)",
background: "rgba(255,0,255,0.3)"
}
},
scaling: {
min: 12
},
shadow: {
enabled: false,
size: 8
},
font: {
color: "rgba(52,52,52,1)",
size: 10,
strokeWidth: 4
},
shape: "dot",
shapeProperties: {
borderRadius: 5
}
},
edges: {
color: 'rgba(192,192,192,0.3)',
arrows: {
to: {
enabled: false,
scaleFactor: 0.4
}
},
smooth: {
type: "continuous",
forceDirection: "vertical"
}
},
interaction: {
multiselect: true
},
groups: {
dataset: {
color:"rgba(0,0,255,0.3)"
},
user: {
color:"rgba(255,0,0,0.3)"
}
},
physics: {
barnesHut: {
centralGravity: 1.95,
springLength: 195,
springConstant: 0.185,
damping: 0.25,
avoidOverlap: 0.5
},
maxVelocity: 10,
minVelocity: 0.75,
stabilization: {
enabled:true,
iterations:200,
updateInterval:1
}
},
configure: {
filter:function (option, path) {
if (path.indexOf('physics') !== -1 || option === 'physics') {
return true;
}
if (path.indexOf('smooth') !== -1 || option === 'smooth') {
return true;
}
if (path.indexOf('layout') !== -1 || option === 'layout') {
return true;
}
return false;
},
container: document.getElementById('config')
}
};
$("#config").html("");
network = new vis.Network(container, data, options);
network.on("stabilizationProgress", function(params) {
var maxWidth = 496;
var minWidth = 20;
var widthFactor = params.iterations/params.total;
var width = Math.max(minWidth,maxWidth * widthFactor);
document.getElementById('bar').style.width = width + 'px';
document.getElementById('text').innerHTML = Math.round(widthFactor*100) + '%';
});
network.once("stabilizationIterationsDone", function() {
document.getElementById('text').innerHTML = '100%';
document.getElementById('bar').style.width = '496px';
document.getElementById('loadingBar').style.opacity = 0;
// really clean the dom element
setTimeout(function () {document.getElementById('loadingBar').style.display = 'none';}, 500);
});
allNodes = nodesDataset.get({returnType:"Object"});
allEdges = edgesDataset.get({returnType:"Object"});
//console.log(allEdges);
network.on('select',neighbourhoodHighlight);
network.on('doubleClick',selectThatNode);
}
function findShortestPath() {
var startId = $("#startPoint").val();
var endId = $("#endPoint").val();
//console.log(startId + endId);
var ids = {
startId : startId,
endId : endId
}
$.ajax({
url: "/getShortestPath",
type: "POST",
contentType: "application/json",
data: JSON.stringify(ids),
dataType: "text"
}).done(function(data1) {
var connectedNodes = null;
console.log(data1);
data1 = JSON.parse(data1);
var edges = data1.edges;
var nodes = data1.nodes;
console.log(nodes[0].label);
for (var i = 0; i< nodes.length; i++) {
allNodes[nodes[i].id].color = 'rgba(0,255,0,1)';
}
for (var i = 0; i< edges.length; i++) {
allEdges[edges[i].id].color = 'rgba(0,255,0,1)';
}
var updateArray = [];
for (nodeId in allNodes) {
if (allNodes.hasOwnProperty(nodeId)) {
updateArray.push(allNodes[nodeId]);
}
}
nodesDataset.update(updateArray);
updateArray = [];
for (edgeId in allEdges) {
if (allEdges.hasOwnProperty(edgeId)) {
updateArray.push(allEdges[edgeId]);
}
}
edgesDataset.update(updateArray);
}).fail(function(xhr, textStatus, errorThrown) {
console.log("error!");
console.log(xhr);
console.log(textStatus);
console.log(errorThrown);
})
}
function selectThatNode(params) {
if (params.nodes.length > 0) {
console.log("TTT");
var node1 = params.nodes[0];
var group = allNodes[node1].group;
var id = null;
switch(group) {
case "service":
id = allNodes[node1].serviceId;
break;
case "dataset":
id = allNodes[node1].datasetId;
break;
case "user":
id = allNodes[node1].userId;
break;
default:
break;
}
console.log("id: " + id);
console.log("idP: " + node1);
console.log("p1: " + p1);
console.log("p2: " + p2);
var parameters = {
param1:p1,
param2:p2,
id:id,
groupName:group
}
$.ajax({
url: "/getPartKnowledgeGraph",
type: "POST",
contentType: "application/json",
data: JSON.stringify(parameters),
dataType: "text"
}).done(function(data1) {
console.log("success");
jsonString = data1;
draw();
}).fail(function(xhr, textStatus, errorThrown) {
console.log("error!");
console.log(xhr);
console.log(textStatus);
console.log(errorThrown);
})
}
}
function selectThatNodeCustomized() {
var group = document.getElementById("paramCombination1").value;
var id = document.getElementById("userConfId").value;
console.log("id: " + id);
console.log("group: " + group);
console.log("p1: " + p1);
console.log("p2: " + p2);
var parameters = {
param1:p1,
param2:p2,
id:id,
groupName:group
}
$.ajax({
url: "/getPartKnowledgeGraph",
type: "POST",
contentType: "application/json",
data: JSON.stringify(parameters),
dataType: "text"
}).done(function(data1) {
console.log("success");
jsonString = data1;
draw();
}).fail(function(xhr, textStatus, errorThrown) {
console.log("error!");
console.log(xhr);
console.log(textStatus);
console.log(errorThrown);
})
}
function neighbourhoodHighlight(params) {
// if something is selected:
if (params.nodes.length > 0) {
highlightActive = true;
var i,j;
var selectedNode = params.nodes[0];
//console.log(selectedNode);
// mark all nodes as hard to read.
for (var nodeId in allNodes) {
allNodes[nodeId].color = 'rgba(192,192,192,0.3)';
if (allNodes[nodeId].hiddenLabel == undefined) {
allNodes[nodeId].hiddenLabel = allNodes[nodeId].label;
allNodes[nodeId].label = undefined;
}
}
for (var edgeId in allEdges) {
allEdges[edgeId].color = 'rgba(192,192,192,0.3)';
if (allEdges[edgeId].hiddenLabel == undefined) {
allEdges[edgeId].hiddenLabel = allEdges[edgeId].label;
allEdges[edgeId].label = undefined;
}
}
allNodes[selectedNode].label = allNodes[selectedNode].hiddenLabel;
var connectedNodes = network.getConnectedNodes(selectedNode);
var allConnectedNodes = [];
// get the second degree nodes
for (i = 1; i < degrees; i++) {
for (j = 0; j < connectedNodes.length; j++) {
allConnectedNodes = allConnectedNodes.concat(network.getConnectedNodes(connectedNodes[j]));
}
}
// all second degree nodes get a different color and their label back
for (i = 0; i < allConnectedNodes.length; i++) {
allNodes[allConnectedNodes[i]].color = 'rgba(0,255,0,0.3)';
if (allNodes[allConnectedNodes[i]].hiddenLabel !== undefined) {
allNodes[allConnectedNodes[i]].label = allNodes[allConnectedNodes[i]].hiddenLabel;
allNodes[allConnectedNodes[i]].hiddenLabel = undefined;
}
}
// all first degree nodes get their own color and their label back
for (i = 0; i < connectedNodes.length; i++) {
allNodes[connectedNodes[i]].color = 'rgba(255,0,0,0.3)';
if (allNodes[connectedNodes[i]].hiddenLabel !== undefined) {
allNodes[connectedNodes[i]].label = allNodes[connectedNodes[i]].hiddenLabel;
allNodes[connectedNodes[i]].hiddenLabel = undefined;
}
}
var curNode = allNodes[selectedNode];
$("#nodeName").text(curNode.title);
$("#id").text(curNode.id);
$("#cluster").text(curNode.cluster);
$("#label").text(curNode.label);
$("#panel").show();
// the main node gets its own color and its label back.
allNodes[selectedNode].color = 'rgba(0,0,255,0.3)'
if (allNodes[selectedNode].hiddenLabel !== undefined) {
allNodes[selectedNode].label = allNodes[selectedNode].hiddenLabel;
allNodes[selectedNode].hiddenLabel = undefined;
}
} else if (highlightActive === true) {
// reset all nodes
for (var nodeId in allNodes) {
allNodes[nodeId].color = undefined;
if (allNodes[nodeId].hiddenLabel !== undefined) {
allNodes[nodeId].label = allNodes[nodeId].hiddenLabel;
allNodes[nodeId].hiddenLabel = undefined;
}
}
for (var edgeId in allEdges) {
allEdges[edgeId].color = undefined;
console.log(allEdges[edgeId].color);
allEdges[edgeId].label = allEdges[edgeId].hiddenLabel;
allEdges[edgeId].hiddenLabel = undefined;
}
highlightActive = false;
}
/*
//console.log(allEdges);
var connectedE = network.getConnectedEdges(selectedNode);
//console.log(connectedE);
for (var i = 0; i< connectedE.length ; i++) {
console.log(allEdges[connectedE[i]]);
allEdges[connectedE[i]].color = 'rgba(0,255,255,0.3)';
}
*/
// transform the object into an array
var updateArray = [];
for (nodeId in allNodes) {
if (allNodes.hasOwnProperty(nodeId)) {
updateArray.push(allNodes[nodeId]);
}
}
nodesDataset.update(updateArray);
updateArray = [];
for (edgeId in allEdges) {
if (allEdges.hasOwnProperty(edgeId)) {
updateArray.push(allEdges[edgeId]);
}
}
edgesDataset.update(updateArray);
}
// draw();
</script>
<script type="text/javascript" src='@routes.Assets.at("javascripts/googleAnalytics.js")'></script>
}
@main("Knowledge Graph", scripts){
<div id="jsonData" style="display: none;">@jsonData</div>
<div id="knowledgeGraph">
<div id="loadingBar" class="col-lg-3">
<div class="outerBorder" >
<div id="text">0%</div>
<div id="border">
<div id="bar"></div>
</div>
</div>
</div>
<div id="mynetwork" class="col-lg-3"></div>
<div class = "col-lg-offset-7">
<button type="button" onclick="showBasicConfig()" class="btn btn-default "><span class="glyphicon glyphicon-cog" aria-hidden="true">
</span> Show Basic Settings </button>
<button type="button" onclick="showAdvancedConfig()" class="btn btn-default "><span class="glyphicon glyphicon-wrench" aria-hidden="true">
</span> Show Advanced Settings </button>
</div>
<div id="basicConf" class="col-lg-offset-7">
<br>
<div class="col-lg-8">
<label>Graph Level</label>
<div class="input-group col-lg-5">
<input type="number" class="form-control" placeholder="1~2" id = "graphLevel">
<span class="input-group-btn">
<button class="btn btn-default" type="button" onclick="setGraphLevel()">Go!</button>
</span>
</div>
<div class="input-group col-lg-6">
<label>Actions</label>
<button type="button" onclick="selectThatNode()" class="btn btn-default "><span class="glyphicon glyphicon-star" aria-hidden="true">
</span> Clear All Node </button>
</div>
<br>
<div class="input-group">
<span class="input-group-addon" id="basic-addon1">Start Point</span>
<input type="text" class="form-control" placeholder="Type in Id" aria-describedby="basic-addon1" id="startPoint">
</div>
<br>
<div class="input-group">
<span class="input-group-addon" id="basic-addon2">End Point</span>
<input type="text" class="form-control" placeholder="Type in Id" aria-describedby="basic-addon2" id="endPoint">
</div>
<br>
<div class="text-center">
<button type="button" class="btn btn-primary" onclick="findShortestPath()">Shortest Path</button>
</div>
<br>
<div class="col-lg-offset-0">
<form>
<label>Rational Graph</label>
<div class="form-group">
<select class="form-control" id="paramCombination">
<option value="User User Dataset">User × User | Dataset</option>
<option value="User User Service">User × User | Service</option>
<option value="Dataset Dataset User">Dataset × Dataset | User</option>
<option value="Dataset Dataset Service">Dataset × Dataset | Service</option>
<option value="Service Service User">Service × Service | User</option>
<option value="Service Service Dataset">Service × Service | Dataset</option>
<option value="User Dataset Service">User × Dataset | Service</option>
<option value="User Service Dataset">User × Service | Dataset</option>
<option value="Dataset Service User">Dataset × Service | User</option>
</select>
</div>
<div class="text-center">
<button type="button" class="btn btn-primary" onclick="Javascript:getParameters()">Finish</button>
</div>
</form>
<br>
<br>
</div>
</div>
</div>
<div id="config" class="row col-lg-offset-7"></div>
</div>
<div class = "row">
<br>
<div id="panel" class="col-lg-offset-7">
<div class="well col-lg-5">
<div class="text-center">
<img class="card-img-top" style=" width:60%;" src="/assets/images/data.png">
</div>
<div class="card-block text-center">
<h4 class="card-title" id="nodeName">card</h4>
<p class="card-text text-muted" >A data set (or dataset) is a collection of data.</p>
</div>
<ul class="list-group list-group-flush">
<li class="list-group-item"><strong>Id:</strong><code id="id"></code></li>
<li class="list-group-item"><strong>Cluster:</strong><code id="cluster"></code></li>
<li class="list-group-item"><strong>Label:</strong><code id="label"></code></li>
</ul>
<div class="card-block">
<a href="#" class="card-link col-lg-offset-0 col-lg-6">Card link</a>
<a href="#" class="card-link col-lg-6">Another link</a>
</div>
</div>
</div>
</div>
<br>
<div id="userConfig" class="col-lg-8">
<form>
<label>Customized ID</label>
<div class="row">
<div class="col-sm-4 col-md-2">
<div class="form-group">
<select class="form-control" id="paramCombination1">
<option value="user">User</option>
<option value="service">Service</option>
<option value="dataset">Dataset</option>
</select>
</div>
</div>
<div class="col-sm-4 col-md-2">
<input type="text" class="form-control col-lg-3" id="userConfId" placeholder="1">
</div>
<div class="col-sm-4 col-md-4">
<button type="button" class="btn btn-primary col-lg-3" onclick="Javascript:selectThatNodeCustomized()">Show</button>
</div>
</div>
</form>
</div>
}