UNPKG

popoto

Version:

Graph based search interface for Neo4j database.

2 lines 93.4 kB
// Copyright (c) 2018 NHOGS Interactive. (function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("d3"),require("jquery")):"function"==typeof define&&define.amd?define(["exports","d3","jquery"],t):t((e=e||self).popoto=e.popoto||{},e.d3,e.jQuery)})(this,function(e,i,o){"use strict";o=o&&o.hasOwnProperty("default")?o.default:o;var n="2.0.18",m={idGen:0,generateId:function(){return m.idGen++},nodes:[],links:[],getRootNode:function(){return m.nodes[0]}},p={};p.LogLevels=Object.freeze({DEBUG:0,INFO:1,WARN:2,ERROR:3,NONE:4}),p.LEVEL=p.LogLevels.NONE,p.TRACE=!1,p.log=function(e,t){if(console&&e>=p.LEVEL)switch(p.TRACE&&(t=t+"\n"+(new Error).stack),e){case p.LogLevels.DEBUG:case p.LogLevels.INFO:console.log(t);break;case p.LogLevels.WARN:console.warn(t);break;case p.LogLevels.ERROR:console.error(t)}},p.debug=function(e){p.log(p.LogLevels.DEBUG,e)},p.info=function(e){p.log(p.LogLevels.INFO,e)},p.warn=function(e){p.log(p.LogLevels.WARN,e)};var A={MAX_RESULTS_COUNT:100,VALUE_QUERY_LIMIT:100,USE_PARENT_RELATION:!(p.error=function(e){p.log(p.LogLevels.ERROR,e)}),USE_RELATION_DIRECTION:!0,RETURN_LABELS:!1,COLLECT_RELATIONS_WITH_VALUES:!1,prefilter:"",prefilterParameters:{},applyPrefilters:function(t){return t.statement=A.prefilter+t.statement,Object.keys(A.prefilterParameters).forEach(function(e){t.parameters[e]=A.prefilterParameters[e]}),t}};A.NEO4J_INTERNAL_ID=Object.freeze({queryInternalName:"NEO4JID"}),A.filterRelation=function(e){return!0},A.generateTaxonomyCountQuery=function(e){var t=b.node.getConstraintAttribute(e),n=[];return b.node.getPredefinedConstraints(e).forEach(function(e){n.push(e.replace(new RegExp("\\$identifier","g"),"n"))}),t===A.NEO4J_INTERNAL_ID?"MATCH (n:`"+e+"`)"+(0<n.length?" WHERE "+n.join(" AND "):"")+" RETURN count(DISTINCT ID(n)) as count":"MATCH (n:`"+e+"`)"+(0<n.length?" WHERE "+n.join(" AND "):"")+" RETURN count(DISTINCT n."+t+") as count"},A.generateNegativeQueryElements=function(){var f=[],h={};return m.nodes.filter(function(e){return!0===e.isNegative}).forEach(function(e){if(void 0!==b.node.getGenerateNegativeNodeValueConstraints(e)){var t=b.node.getGenerateNegativeNodeValueConstraints(e)(e);for(var n in f=f.concat(t.whereElements),t.parameters)t.parameters.hasOwnProperty(n)&&(h[n]=t.parameters[n])}else{var r=A.getLinksToRoot(e,m.links),a=r.length-1,o="(NOT exists(";for(o+="("+m.getRootNode().internalLabel+")";0<=a;){var l=r[a],i=l.target;if(!0===i.isParentRelReverse&&!0===A.USE_RELATION_DIRECTION?o+="<-":o+="-",o+="[:`"+l.label+"`]",!0!==i.isParentRelReverse&&!0===A.USE_RELATION_DIRECTION?o+="->":o+="-",i===e&&void 0!==i.value&&0<i.value.length){var s=b.node.getConstraintAttribute(i.label),u=i.internalLabel+"_"+s;if(1<i.value.length){for(var d=0;d<i.value.length;d++)h[u+"_"+d]=i.value[d].attributes[s];o+="(:`"+i.label+"`{"+s+":$x$})"}else h[u]=i.value[0].attributes[s],o+="(:`"+i.label+"`{"+s+":$"+u+"})"}else o+="(:`"+i.label+"`)";a--}if(o+="))",void 0!==e.value&&1<e.value.length)for(var p=b.node.getConstraintAttribute(e.label),c=e.internalLabel+"_"+p,g=0;g<i.value.length;g++)f.push(o.replace("$x$","$"+c+"_"+g));else f.push(o)}}),{whereElements:f,parameters:h}},A.generateQueryElements=function(t,d,e,p,c){var g=[],f=[],h=[],v=[],E={};if(b.node.getPredefinedConstraints(t.label).forEach(function(e){f.push(e.replace(new RegExp("\\$identifier","g"),t.internalLabel))}),g.push("("+t.internalLabel+":`"+t.label+"`)"),p||t.immutable){var n=A.generateNodeValueConstraints(t,c);for(var r in f=f.concat(n.whereElements),n.parameters)n.parameters.hasOwnProperty(r)&&(E[r]=n.parameters[r])}var y=0;return e.forEach(function(e){var t=e.source,n=e.target,r="",a="";a=A.USE_RELATION_DIRECTION?!0===n.isParentRelReverse?(r="<-","-"):(r="-","->"):r="-";var o="r"+y++;h.push(o),b.node.getPredefinedConstraints(n.label).forEach(function(e){f.push(e.replace(new RegExp("\\$identifier","g"),n.internalLabel))}),A.COLLECT_RELATIONS_WITH_VALUES&&n===d&&v.push("COLLECT("+o+") AS incomingRels");var l="";c&&void 0!==b.node.getGenerateNodeValueConstraints(t)||(l=":`"+t.label+"`");var i="";if(c&&void 0!==b.node.getGenerateNodeValueConstraints(n)||(i=":`"+n.label+"`"),g.push("("+t.internalLabel+l+")"+r+"["+o+":`"+e.label+"`]"+a+"("+n.internalLabel+i+")"),n!==d&&(p||n.immutable)){var s=A.generateNodeValueConstraints(n,c);for(var u in f=f.concat(s.whereElements),s.parameters)s.parameters.hasOwnProperty(u)&&(E[u]=s.parameters[u])}}),{matchElements:g,whereElements:f,relationElements:h,returnElements:v,parameters:E}},A.generateNodeValueConstraints=function(e,t){if(t&&void 0!==b.node.getGenerateNodeValueConstraints(e))return b.node.getGenerateNodeValueConstraints(e)(e);var n={},r=[];if(void 0!==e.value&&0<e.value.length){var a,o=b.node.getConstraintAttribute(e.label);if(a=o===A.NEO4J_INTERNAL_ID?e.internalLabel+"_internalID":e.internalLabel+"_"+o,1<e.value.length)n[a]=[],e.value.forEach(function(e){var t;t=o===A.NEO4J_INTERNAL_ID?e.internalID:e.attributes[o],n[a].push(t)}),o===A.NEO4J_INTERNAL_ID?r.push("ID("+e.internalLabel+") IN $"+a):r.push(e.internalLabel+"."+o+" IN $"+a);else{o===A.NEO4J_INTERNAL_ID?n[a]=e.value[0].internalID:n[a]=e.value[0].attributes[o];o===A.NEO4J_INTERNAL_ID?r.push("ID("+e.internalLabel+") = $"+a):r.push(e.internalLabel+"."+o+" = $"+a)}}return{parameters:n,whereElements:r}},A.getRelevantLinks=function(a,t,e){var o=e.slice(),l=[],n=o.filter(function(e){return e.target===t||void 0!==e.target.value&&0<e.target.value.length&&!0==!e.target.isNegative});return n.forEach(function(e){o.splice(o.indexOf(e),1)}),n.forEach(function(e){for(var t=e.source,n=!0;n;){var r=null;o.forEach(function(e){e.target===t&&(r=e)}),null===r?n=!1:r.source===a?(l.push(r),o.splice(o.indexOf(r),1),n=!1):(l.push(r),o.splice(o.indexOf(r),1),t=r.source)}}),n.concat(l)},A.getLinksToRoot=function(e,t){for(var n=[],r=e;r!==m.getRootNode();){for(var a,o=0;o<t.length;o++){var l=t[o];if(l.target===r){a=l;break}}a&&(n.push(a),r=a.source)}return n},A.generateResultQuery=function(e){var t=m.getRootNode(),n=A.generateNegativeQueryElements(),r=A.generateQueryElements(t,t,A.getRelevantLinks(t,t,m.links),!0,!0),a=r.matchElements,o=r.whereElements.concat(n.whereElements),l=r.relationElements,i=[],s=[],u=r.parameters;for(var d in n.parameters)n.parameters.hasOwnProperty(d)&&(u[d]=n.parameters[d]);var p=b.node.getResultOrderByAttribute(t.label);if(null!=p){var c=[],g=b.node.isResultOrderAscending(t.label),f=[];Array.isArray(g)?f=g.map(function(e){return e?"ASC":"DESC"}):f.push(g?"ASC":"DESC"),Array.isArray(p)?c=p.map(function(e){var t=p.indexOf(e);return t<f.length?e+" "+f[t]:e+" "+f[f.length-1]}):c.push(p+" "+f[0]),s.push("ORDER BY "+c.join(", "))}if(u.limit=A.MAX_RESULTS_COUNT,s.push("LIMIT $limit"),e)i.push(t.internalLabel),l.forEach(function(e){i.push(e)});else{var h=b.node.getReturnAttributes(t.label);if(i=h.map(function(e){return e===A.NEO4J_INTERNAL_ID?"ID("+t.internalLabel+") AS "+A.NEO4J_INTERNAL_ID.queryInternalName:t.internalLabel+"."+e+" AS "+e}),!0===A.RETURN_LABELS){var v="labels("+t.internalLabel+")";h.indexOf("labels")<0&&(v+=" AS labels"),i.push(v)}}var E="MATCH "+a.join(", ")+(0<o.length?" WHERE "+o.join(" AND "):"")+" RETURN DISTINCT "+i.join(", ")+" "+s.join(" "),y=b.node.filterResultQuery(t.label,{statement:E,matchElements:a,whereElements:o,withElements:[],returnElements:i,endElements:s,parameters:u});return A.applyPrefilters(y)},A.generateNodeCountQuery=function(e){var t=A.generateNegativeQueryElements(),n=A.generateQueryElements(m.getRootNode(),e,A.getRelevantLinks(m.getRootNode(),e,m.links),!0,!0),r=n.matchElements,a=n.whereElements.concat(t.whereElements),o=[],l=n.parameters;for(var i in t.parameters)t.parameters.hasOwnProperty(i)&&(l[i]=t.parameters[i]);var s=b.node.getConstraintAttribute(e.label);s===A.NEO4J_INTERNAL_ID?o.push("count(DISTINCT ID("+e.internalLabel+")) as count"):o.push("count(DISTINCT "+e.internalLabel+"."+s+") as count");var u="MATCH "+r.join(", ")+(0<a.length?" WHERE "+a.join(" AND "):"")+" RETURN "+o.join(", "),d=b.node.filterNodeCountQuery(e,{statement:u,matchElements:r,whereElements:a,returnElements:o,endElements:[],parameters:l});return A.applyPrefilters(d)},A.generateNodeValueQuery=function(e){var t=A.generateNegativeQueryElements(),n=m.getRootNode(),r=A.generateQueryElements(n,e,A.getRelevantLinks(n,e,m.links),!0,!1),a=r.matchElements,o=r.whereElements.concat(t.whereElements),l=[],i=[],s=r.parameters;for(var u in t.parameters)t.parameters.hasOwnProperty(u)&&(s[u]=t.parameters[u]);var d=b.node.getValueOrderByAttribute(e.label);if(d){var p=b.node.isValueOrderAscending(e.label)?"ASC":"DESC";i.push("ORDER BY "+d+" "+p)}i.push("LIMIT "+A.VALUE_QUERY_LIMIT);for(var c=b.node.getReturnAttributes(e.label),g=(b.node.getConstraintAttribute(e.label),0);g<c.length;g++)c[g]===A.NEO4J_INTERNAL_ID?l.push("ID("+e.internalLabel+") AS "+A.NEO4J_INTERNAL_ID.queryInternalName):l.push(e.internalLabel+"."+c[g]+" AS "+c[g]);var f=b.node.getConstraintAttribute(n.label);f===A.NEO4J_INTERNAL_ID?l.push("count(DISTINCT ID("+n.internalLabel+")) AS count"):l.push("count(DISTINCT "+n.internalLabel+"."+f+") AS count"),A.COLLECT_RELATIONS_WITH_VALUES&&r.returnElements.forEach(function(e){l.push(e)});var h="MATCH "+a.join(", ")+(0<o.length?" WHERE "+o.join(" AND "):"")+" RETURN "+l.join(", ")+" "+i.join(" "),v=b.node.filterNodeValueQuery(e,{statement:h,matchElements:a,whereElements:o,returnElements:l,endElements:i,parameters:s});return A.applyPrefilters(v)};var c={CYPHER_URL:"http://localhost:7474/db/data/transaction/commit",WITH_CREDENTIALS:!(A.generateNodeRelationQuery=function(e){var t=A.getLinksToRoot(e,m.links),n=A.generateQueryElements(m.getRootNode(),e,t,!1,!1),r=n.matchElements,a=n.whereElements,o=[],l=[],i=n.parameters,s=A.USE_RELATION_DIRECTION?"->":"-";r.push("("+e.internalLabel+":`"+e.label+"`)-[r]"+s+"(x)"),o.push("type(r) AS label"),A.USE_PARENT_RELATION?o.push("head(labels(x)) AS target"):o.push("last(labels(x)) AS target"),o.push("count(r) AS count"),l.push("ORDER BY count(r) DESC");var u="MATCH "+r.join(", ")+(0<a.length?" WHERE "+a.join(" AND "):"")+" RETURN "+o.join(", ")+" "+l.join(" "),d=b.node.filterNodeRelationQuery(e,{statement:u,matchElements:r,whereElements:a,returnElements:o,endElements:l,parameters:i});return A.applyPrefilters(d)}),post:function(e,t){var n=JSON.stringify(e);p.info("REST POST:"+n);var r={type:"POST",beforeSend:function(e){c.AUTHORIZATION&&e.setRequestHeader("Authorization",c.AUTHORIZATION)},contentType:"application/json"};void 0!==e&&(r.data=n),!0===c.WITH_CREDENTIALS&&(r.xhrFields={withCredentials:!0});var a=c.CYPHER_URL;return void 0!==t&&(a=t),o.ajax(a,r)}};c.response={parse:function(e){p.debug(JSON.stringify(e));var t=[];return void 0!==e&&e.hasOwnProperty("results")&&0<e.results.length&&!(e.hasOwnProperty("errors")&&0<e.errors.length)&&(t=e.results.map(function(e){for(var t=[],n=0;n<e.data.length;n++){for(var r={},a=0;a<e.columns.length;a++)r[e.columns[a]]=e.data[n].row[a];t.push(r)}return t})),p.info(JSON.stringify(t)),t}};var g={};function f(){d();var e=m.getRootNode();e&&void 0!==e.label&&(L.isActive&&L.updateQuery(),S.isActive&&S.updateQuery(),(g.isActive||0<g.resultListeners.length||0<g.resultCountListeners.length||0<g.graphResultListeners.length)&&g.updateResults())}function d(){O.isActive&&(O.link.updateLinks(),O.node.updateNodes(),O.force.nodes(m.nodes),O.force.force("link").links(m.links),O.force.alpha(1).restart())}g.containerId="popoto-results",g.hasChanged=!0,g.resultCountListeners=[],g.resultListeners=[],g.graphResultListeners=[],g.RESULTS_PAGE_SIZE=10,g.TOTAL_COUNT=!1,g.onTotalResultCount=function(e){g.resultCountListeners.push(e)},g.onResultReceived=function(e){g.resultListeners.push(e)},g.onGraphResultReceived=function(e){g.graphResultListeners.push(e)},g.parseGraphResultData=function(e){var t={},n={};e.results[1].data.forEach(function(e){e.graph.nodes.forEach(function(e){t.hasOwnProperty(e.id)||(t[e.id]=e)}),e.graph.relationships.forEach(function(e){n.hasOwnProperty(e.id)||(n[e.id]=e)})});var r=[],a=[];for(var o in t)t.hasOwnProperty(o)&&r.push(t[o]);for(var l in n)n.hasOwnProperty(l)&&a.push(n[l]);return{nodes:r,edges:a}},g.updateResults=function(){if(g.hasChanged){var l={},e=0;void 0!==g.resultsXhr&&g.resultsXhr.abort();var t=A.generateResultQuery(),n={statements:[{statement:(g.lastGeneratedQuery=t).statement,parameters:t.parameters,resultDataContents:["row"]}]};if(l.results=e++,0<g.graphResultListeners.length){var r=A.generateResultQuery(!0);g.lastGeneratedQuery=r,n.statements.push({statement:r.statement,parameters:r.parameters,resultDataContents:["row","graph"]}),l.graph=e++}if(!0===g.TOTAL_COUNT&&0<g.resultCountListeners.length){var a=A.generateNodeCountQuery(m.getRootNode());n.statements.push({statement:a.statement,parameters:a.parameters}),l.total=e++}p.info("Results ==>"),g.resultsXhr=c.post(n).done(function(e){p.info("<== Results");var t=c.response.parse(e),n=t[l.results].map(function(e,t){return{resultIndex:t,label:m.getRootNode().label,attributes:e}});if(g.lastResults=n,l.hasOwnProperty("total")){var r=t[l.total][0].count;g.resultCountListeners.forEach(function(e){e(r)})}if(g.resultListeners.forEach(function(e){e(n)}),0<g.graphResultListeners.length){var a=g.parseGraphResultData(e);g.graphResultListeners.forEach(function(e){e(a)})}if(g.isActive){var o=i.select("#"+g.containerId).selectAll(".ppt-result").data([]);o.exit().remove(),(o=i.select("#"+g.containerId).selectAll(".ppt-result").data(n.slice(0,g.RESULTS_PAGE_SIZE),function(e){return e.resultIndex})).enter().append("div").attr("class","ppt-result").attr("id",function(e){return"popoto-result-"+e.resultIndex}).each(function(e){b.node.getDisplayResults(e.label)(i.select(this))})}g.hasChanged=!1}).fail(function(e,t,n){"abort"!==t?(p.error(t+': error while accessing Neo4j server on URL:"'+c.CYPHER_URL+'" defined in "rest.CYPHER_URL" property: '+n),g.resultListeners.forEach(function(e){e([])})):p.info("<=X= Results - Aborted!")})}},g.updateResultsCount=function(){0<g.resultCountListeners.length&&g.resultCountListeners.forEach(function(e){e(m.getRootNode().count)})},g.generatePreQuery=function(){var t={ids:[]};return g.lastResults.forEach(function(e){t.ids.push(e.attributes.id)}),{query:"MATCH (d) WHERE d.id IN $ids WITH d",param:t}};var l={containerId:"popoto-taxonomy",createTaxonomyPanel:function(){var e=i.select("#"+l.containerId).append("ul").attr("class","ppt-taxo-ul"),t=l.generateTaxonomiesData(),n=e.selectAll(".taxo").data(t).enter().append("li").attr("id",function(e){return e.id}).attr("class","ppt-taxo-li").attr("value",function(e){return e.label});n.append("span").attr("class",function(e){return"ppt-icon "+b.taxonomy.getCSSClass(e.label,"span-icon")}).html("&nbsp;"),n.append("span").attr("class","ppt-label").text(function(e){return b.taxonomy.getTextValue(e.label)}),n.append("span").attr("class","ppt-count"),n.on("click",l.onClick),l.addTaxonomyChildren(n);var r=[];t.forEach(function(e){r.push(e),e.children&&l.flattenChildren(e,r)}),O.DISABLE_COUNT||l.updateCount(r)},flattenChildren:function(e,t){e.children.forEach(function(e){t.push(e),e.children&&t.concat(l.flattenChildren(e,t))})},updateCount:function(e){var a,t=[];e.forEach(function(e){t.push({statement:A.generateTaxonomyCountQuery(e.label)})}),a=e,p.info("Count taxonomies ==>"),c.post({statements:t}).done(function(e){p.info("<== Count taxonomies");for(var t=c.response.parse(e),n=0;n<a.length;n++){var r=t[n][0].count;i.select("#"+a[n].id).select(".ppt-count").text(" ("+r+")")}}).fail(function(e,t,n){p.error(t+': error while accessing Neo4j server on URL:"'+c.CYPHER_URL+'" defined in "rest.CYPHER_URL" property: '+n),i.select("#popoto-taxonomy").selectAll(".ppt-count").text(" (0)")})},addTaxonomyChildren:function(e){e.each(function(e){var t=i.select(this),n=e.children;if(e.children){var r=t.append("ul").attr("class","ppt-taxo-sub-ul").selectAll("li").data(n).enter().append("li").attr("id",function(e){return e.id}).attr("class","ppt-taxo-sub-li").attr("value",function(e){return e.label});r.append("span").attr("class",function(e){return"ppt-icon "+b.taxonomy.getCSSClass(e.label,"span-icon")}).html("&nbsp;"),r.append("span").attr("class","ppt-label").text(function(e){return b.taxonomy.getTextValue(e.label)}),r.append("span").attr("class","ppt-count"),r.on("click",l.onClick),l.addTaxonomyChildren(r)}})},onClick:function(){i.event.stopPropagation();var e=this.attributes.value.value;m.nodes.length=0,m.links.length=0,O.node.internalLabels={},f(),O.mainLabel=e,void 0!==b.node.getSchema(e)?O.addSchema(b.node.getSchema(e)):O.addRootNode(e),O.hasGraphChanged=!0,g.hasChanged=!0,O.ignoreCount=!1,f(),r.center()},generateTaxonomiesData:function(){var t=0,e=[];for(var n in b.node.Provider)b.node.Provider.hasOwnProperty(n)&&b.node.getProperty(n,"isSearchable")&&!b.node.Provider[n].parent&&e.push({label:n,id:"popoto-lbl-"+t++});return e.forEach(function(e){b.node.getProvider(e.label).hasOwnProperty("children")&&(t=l.addChildrenData(e,t))}),e},addChildrenData:function(r,a){return r.children=[],b.node.getProvider(r.label).children.forEach(function(e){var t=b.node.getProvider(e),n={label:e,id:"popoto-lbl-"+a++};t.hasOwnProperty("children")&&(a=l.addChildrenData(n,a)),b.node.getProperty(e,"isSearchable")&&r.children.push(n)}),a}},r={CENTER_GRAPH:!0,RESET_GRAPH:!0,SAVE_GRAPH:!1,TOGGLE_TAXONOMY:!1,TOGGLE_FULL_SCREEN:!0,TOGGLE_VIEW_RELATION:!0,TOGGLE_FIT_TEXT:!0,reset:function(){m.nodes.length=0,m.links.length=0,O.node.internalLabels={},"string"==typeof O.mainLabel||O.mainLabel instanceof String?void 0!==b.node.getSchema(O.mainLabel)?O.addSchema(b.node.getSchema(O.mainLabel)):O.addRootNode(O.mainLabel):O.loadSchema(O.mainLabel),O.hasGraphChanged=!0,g.hasChanged=!0,f(),r.center()},center:function(){O.svgTag.transition().call(O.zoom.transform,i.zoomIdentity)},toggleTaxonomy:function(){var e=i.select("#"+l.containerId);e.filter(".disabled").empty()?e.classed("disabled",!0):e.classed("disabled",!1),O.centerRootNode()},toggleFitText:function(){O.USE_FIT_TEXT=!O.USE_FIT_TEXT,O.node.updateNodes()},toggleViewRelation:function(){O.DISABLE_RELATION=!O.DISABLE_RELATION,i.selectAll(".ppt-g-node-background").classed("hide",O.DISABLE_RELATION),O.tick()},toggleFullScreen:function(){var e=document.getElementById(O.containerId);document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement?document.exitFullscreen?document.exitFullscreen():document.msExitFullscreen?document.msExitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen():e.requestFullscreen?e.requestFullscreen():e.msRequestFullscreen?e.msRequestFullscreen():e.mozRequestFullScreen?e.mozRequestFullScreen():e.webkitRequestFullscreen&&e.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}},a={TOOL_TAXONOMY:"Show/hide taxonomy panel",TOOL_RELATION:"Show/hide relation",TOOL_CENTER:"Center view",TOOL_FULL_SCREEN:"Full screen",TOOL_RESET:"Reset graph",TOOL_SAVE:"Save graph",TOOL_FIT_TEXT:"Fit text in nodes",render:function(e){var t=e.append("div").attr("class","ppt-toolbar");r.TOGGLE_VIEW_RELATION&&t.append("span").attr("id","popoto-toggle-relation").attr("class","ppt-icon ppt-menu relation").attr("title",t.TOOL_RELATION).on("click",function(){r.toggleViewRelation()}),r.RESET_GRAPH&&t.append("span").attr("id","popoto-reset-menu").attr("class","ppt-icon ppt-menu reset").attr("title",t.TOOL_RESET).on("click",function(){O.notifyListeners(O.Events.GRAPH_RESET,[]),r.reset()}),r.TOGGLE_TAXONOMY&&t.append("span").attr("id","popoto-taxonomy-menu").attr("class","ppt-icon ppt-menu taxonomy").attr("title",t.TOOL_TAXONOMY).on("click",r.toggleTaxonomy),r.CENTER_GRAPH&&t.append("span").attr("id","popoto-center-menu").attr("class","ppt-icon ppt-menu center").attr("title",t.TOOL_CENTER).on("click",r.center),r.TOGGLE_FULL_SCREEN&&t.append("span").attr("id","popoto-fullscreen-menu").attr("class","ppt-icon ppt-menu fullscreen").attr("title",t.TOOL_FULL_SCREEN).on("click",r.toggleFullScreen),r.SAVE_GRAPH&&t.append("span").attr("id","popoto-save-menu").attr("class","ppt-icon ppt-menu save").attr("title",t.TOOL_SAVE).on("click",function(){O.notifyListeners(O.Events.GRAPH_SAVE,[O.getSchema()])}),r.TOGGLE_FIT_TEXT&&t.append("span").attr("id","popoto-fit-text-menu").attr("class","ppt-icon ppt-menu fit-text").attr("title",t.TOOL_FIT_TEXT).on("click",r.toggleFitText)}},s={};function u(e){return"function"==typeof e?e:function(){return e}}s.LinkTypes=Object.freeze({RELATION:0,VALUE:1,SEGMENT:2}),s.TEXT_DY=-4,s.SHOW_MARKER=!1,s.gID="popoto-glinks",s.updateLinks=function(){var e=s.updateData();s.removeElements(e.exit()),s.addNewElements(e.enter()),s.updateElements()},s.updateData=function(){return O.svg.select("#"+s.gID).selectAll(".ppt-glink").data(m.links,function(e){return e.id})},s.removeElements=function(e){e.remove()},s.addNewElements=function(e){var t=e.append("g").attr("class","ppt-glink").on("click",s.clickLink).on("mouseover",s.mouseOverLink).on("mouseout",s.mouseOutLink);t.append("path").attr("class","ppt-link"),t.append("text").attr("text-anchor","middle").attr("dy",s.TEXT_DY).append("textPath").attr("class","ppt-textPath").attr("startOffset","50%")},s.updateElements=function(){var e=O.svg.select("#"+s.gID).selectAll(".ppt-glink");e.attr("id",function(e){return"ppt-glink_"+e.id}),e.selectAll(".ppt-link").attr("id",function(e){return"ppt-path_"+e.id}).attr("stroke",function(e){return b.link.getColor(e,"path","stroke")}).attr("class",function(e){return"ppt-link "+b.link.getCSSClass(e,"path")}),e.selectAll("text").attr("id",function(e){return"ppt-text_"+e.id}).attr("class",function(e){return b.link.getCSSClass(e,"text")}).attr("fill",function(e){return b.link.getColor(e,"text","fill")}).selectAll(".ppt-textPath").attr("id",function(e){return"ppt-textpath_"+e.id}).attr("class",function(e){return"ppt-textpath "+b.link.getCSSClass(e,"text-path")}).attr("xlink:href",function(e){return"#ppt-path_"+e.id}).text(function(e){return b.link.getTextValue(e)})},s.mouseOverLink=function(){i.select(this).select("path").attr("class",function(e){return"ppt-link "+b.link.getCSSClass(e,"path--hover")}),i.select(this).select("text").attr("class",function(e){return b.link.getCSSClass(e,"text--hover")});var t=i.select(this).data()[0];L.isActive&&(L.queryConstraintSpanElements.filter(function(e){return e.ref===t}).classed("hover",!0),L.querySpanElements.filter(function(e){return e.ref===t}).classed("hover",!0)),S.isActive&&S.querySpanElements.filter(function(e){return e.link===t}).classed("hover",!0)},s.mouseOutLink=function(){i.select(this).select("path").attr("class",function(e){return"ppt-link "+b.link.getCSSClass(e,"path")}),i.select(this).select("text").attr("class",function(e){return b.link.getCSSClass(e,"text")});var t=i.select(this).data()[0];L.isActive&&(L.queryConstraintSpanElements.filter(function(e){return e.ref===t}).classed("hover",!1),L.querySpanElements.filter(function(e){return e.ref===t}).classed("hover",!1)),S.isActive&&S.querySpanElements.filter(function(e){return e.link===t}).classed("hover",!1)},s.clickLink=function(){var e=i.select(this).data()[0];if(e.type!==s.LinkTypes.VALUE){O.node.collapseAllNode();var t=O.node.removeNode(e.target);O.hasGraphChanged=!0,g.hasChanged=t,f()}};var t=document.createElement("canvas").getContext("2d"),h=12;function v(e){return t.measureText(e).width}function E(e){if(null==e)return[];var t=String(e);return function(e,t){for(var n,r=1/0,a=[],o=0,l=e.length;o<l;++o){var i=(n?n.text+" ":"")+e[o],s=v(i);(r+s)/2<t?(n.width=r=s,n.text=i):(n={width:r=v(e[o]),text:e[o]},a.push(n))}return a}(function(e){var t=e.split(/\s+/g);return t[t.length-1]||t.pop(),t[0]||t.shift(),t}(t),function(e){return Math.sqrt(v(e.trim())*h)}(t))}function y(e,t,n,r){var a=u(n),o=u(t);(function(e,n){e.each(function(e){var t=i.select(this).selectAll(".fitted-text").data([{}]);t.enter().append("text").merge(t).attr("class","fitted-text"+(void 0!==n?" "+n(e):"")).attr("style","text-anchor: middle; font: 10px sans-serif")})})(e,r?u(r):r);var l=e.select(".fitted-text");(function(e,r){e.each(function(e){var n=E(r(e)),t=i.select(this).selectAll("tspan").data(n);t.exit().remove(),t.enter().append("tspan").merge(t).attr("x",0).attr("y",function(e,t){return(t-n.length/2+.8)*h}).text(function(e){return e.text})})})(l,o),l.attr("transform",function(e){var t=function(e){for(var t=0,n=0,r=e.length;n<r;++n){var a=e[n].width/2,o=(Math.abs(n-r/2+.5)+.5)*h;t=Math.max(t,Math.sqrt(a*a+o*o))}return t}(E(o(e))),n=1;return 0!==t&&t&&(n=a(e)/t),"translate(0,0) scale("+n+")"})}var N={getNodeBoundingBox:function(e){return e.getBBox()},render:function(e){var t=e.append("rect").attr("fill",function(e){return b.node.getColor(e,"back-text","fill")}).attr("class",function(e){return b.node.getCSSClass(e,"back-text")});y(e,function(e){return b.node.getTextValue(e)},function(e){return b.node.getSize(e)},function(e){return b.node.getCSSClass(e,"text")}),t.attr("x",function(e){return N.getNodeBoundingBox(i.select(this.parentNode).select("text").node()).x-3}).attr("y",function(e){return N.getNodeBoundingBox(i.select(this.parentNode).select("text").node()).y}).attr("rx","5").attr("ry","5").attr("width",function(e){return N.getNodeBoundingBox(i.select(this.parentNode).select("text").node()).width+6}).attr("height",function(e){return N.getNodeBoundingBox(i.select(this.parentNode).select("text").node()).height}).attr("transform",function(e){return i.select(this.parentNode).select("text").attr("transform")})}},R={TEXT_Y:8,getNodeBoundingBox:function(e){return e.getBBox()},render:function(e){var t=e.append("rect").attr("fill",function(e){return b.node.getColor(e,"back-text","fill")}).attr("class",function(e){return b.node.getCSSClass(e,"back-text")});e.append("text").attr("x",0).attr("y",R.TEXT_Y).attr("text-anchor","middle").attr("class",function(e){return b.node.getCSSClass(e,"text")}).on("mouseover",function(e){i.select(this.parentNode).attr("clip-path",null)}).on("mouseout",function(e){i.select(this.parentNode).attr("clip-path",function(e){return"url(#node-view"+e.id+")"})}).text(function(e){return b.node.getTextValue(e)}),t.attr("x",function(e){return R.getNodeBoundingBox(i.select(this.parentNode).select("text").node()).x-3}).attr("y",function(e){return R.getNodeBoundingBox(i.select(this.parentNode).select("text").node()).y}).attr("rx","5").attr("ry","5").attr("width",function(e){return R.getNodeBoundingBox(i.select(this.parentNode).select("text").node()).width+6}).attr("height",function(e){return R.getNodeBoundingBox(i.select(this.parentNode).select("text").node()).height})}},T={gID:"popoto-gnodes",DONUTS_MARGIN:0,DONUT_WIDTH:20,NODE_MAX_CHARS:11,NODE_TITLE_MAX_CHARS:100,PAGE_SIZE:10,CountBox:{x:16,y:33,w:52,h:19},chooseWaiting:!1,getDonutInnerRadius:function(e){return b.node.getSize(e)+T.DONUTS_MARGIN},getDonutOuterRadius:function(e){return b.node.getSize(e)+T.DONUTS_MARGIN+T.DONUT_WIDTH}};T.pie=i.pie().sort(null).value(function(e){return 1}),T.NodeTypes=Object.freeze({ROOT:0,CHOOSE:1,VALUE:2,GROUP:3}),T.internalLabels={},T.generateInternalLabel=function(e){var t=e?e.toLowerCase().replace(/ /g,""):"n";return t in T.internalLabels?(T.internalLabels[t]=T.internalLabels[t]+1,t+T.internalLabels[t]):(T.internalLabels[t]=0,t)},T.updateNodes=function(){var e=T.updateData();T.removeElements(e.exit()),T.addNewElements(e.enter()),T.updateElements()},T.updateData=function(){var e=O.svg.select("#"+T.gID).selectAll(".ppt-gnode").data(m.nodes,function(e){return e.id});return O.hasGraphChanged&&(T.updateAutoLoadValues(),O.DISABLE_COUNT||O.ignoreCount||T.updateCount()),O.hasGraphChanged=!1,e},T.updateCount=function(){void 0!==T.updateCountXhr&&T.updateCountXhr.abort();var n=[],r=m.nodes.filter(function(e){return!(e.type===T.NodeTypes.VALUE||e.type===T.NodeTypes.GROUP||e.hasOwnProperty("isNegative")&&e.isNegative)});r.forEach(function(e){var t=A.generateNodeCountQuery(e);n.push({statement:t.statement,parameters:t.parameters})}),p.info("Count nodes ==>"),T.updateCountXhr=c.post({statements:n}).done(function(e){p.info("<== Count nodes");for(var t=c.response.parse(e),n=0;n<r.length;n++)r[n].count=t[n][0].count;0<g.resultCountListeners.length&&g.updateResultsCount(),T.updateElements(),O.link.updateElements()}).fail(function(e,t,n){"abort"!==t?(p.error(t+': error while accessing Neo4j server on URL:"'+c.CYPHER_URL+'" defined in "rest.CYPHER_URL" property: '+n),r.forEach(function(e){e.count=0}),T.updateElements(),O.link.updateElements()):p.info("<=X= Count nodes - Aborted!")})},T.updateAutoLoadValues=function(){for(var e=[],o=T.getAutoLoadValueNodes(),t=0;t<o.length;t++){var n=o[t],r=A.generateNodeValueQuery(n);e.push({statement:r.statement,parameters:r.parameters})}0<e.length&&(p.info("AutoLoadValue ==>"),c.post({statements:e}).done(function(e){p.info("<== AutoLoadValue");for(var t=c.response.parse(e),n=0;n<o.length;n++){var r=o[n],a=b.node.getConstraintAttribute(r.label);r.data=t[n].filter(function(t){var n=!0;return r.hasOwnProperty("value")&&0<r.value.length&&r.value.forEach(function(e){e.attributes[a]===t[a]&&(n=!1)}),n}),r.page=1}O.notifyListeners(O.Events.GRAPH_NODE_DATA_LOADED,[o])}).fail(function(e,t,n){p.error(t+': error while accessing Neo4j server on URL:"'+c.CYPHER_URL+'" defined in "rest.CYPHER_URL" property: '+n)}))},T.removeElements=function(e){e.filter(function(e){return!e.parent}).remove(),e.filter(function(e){return e.parent}).transition().duration(300).attr("transform",function(e){return"translate("+e.parent.x+","+e.parent.y+")"}).remove()},T.addNewElements=function(e){var t=e.append("g").attr("class","ppt-gnode");t.on("click",T.nodeClick).on("mouseover",T.mouseOverNode).on("mouseout",T.mouseOutNode),t.filter(function(e){return e.type!==T.NodeTypes.VALUE}).on("contextmenu",T.clearSelection),t.filter(function(e){return e.type===T.NodeTypes.VALUE}).on("contextmenu",function(){i.event.preventDefault()}),t.append("defs").append("clipPath").attr("id",function(e){return"node-view"+e.id}).append("circle").attr("cx",0).attr("cy",0),T.addBackgroundElements(t),T.addMiddlegroundElements(t),T.addForegroundElements(t)},T.addBackgroundElements=function(e){var t=e.append("g").attr("class","ppt-g-node-background").classed("hide",O.DISABLE_RELATION);t.append("g").attr("class","ppt-donut-labels"),t.append("g").attr("class","ppt-donut-segments")},T.addMiddlegroundElements=function(e){e.append("g").attr("class","ppt-g-node-middleground")},T.addForegroundElements=function(e){var t=e.append("g").attr("class","ppt-g-node-foreground"),n=t.filter(function(e){return e.type===T.NodeTypes.ROOT||e.type===T.NodeTypes.CHOOSE}).append("g").attr("class","ppt-node-foreground-g-arrows"),r=n.append("g");r.append("circle").attr("class","ppt-larrow").attr("cx","-43").attr("cy","-23").attr("r","17"),r.append("path").attr("class","ppt-arrow").attr("d","m -44.905361,-23 6.742,-6.742 c 0.81,-0.809 0.81,-2.135 0,-2.944 l -0.737,-0.737 c -0.81,-0.811 -2.135,-0.811 -2.945,0 l -8.835,8.835 c -0.435,0.434 -0.628,1.017 -0.597,1.589 -0.031,0.571 0.162,1.154 0.597,1.588 l 8.835,8.834 c 0.81,0.811 2.135,0.811 2.945,0 l 0.737,-0.737 c 0.81,-0.808 0.81,-2.134 0,-2.943 l -6.742,-6.743 z"),r.on("click",function(e){i.event.stopPropagation(),1<e.page&&(e.page--,T.collapseNode(e),T.expandNode(e))});var a=n.append("g");if(a.append("circle").attr("class","ppt-rarrow").attr("cx","43").attr("cy","-23").attr("r","17"),a.append("path").attr("class","ppt-arrow").attr("d","m 51.027875,-24.5875 -8.835,-8.835 c -0.811,-0.811 -2.137,-0.811 -2.945,0 l -0.738,0.737 c -0.81,0.81 -0.81,2.136 0,2.944 l 6.742,6.742 -6.742,6.742 c -0.81,0.81 -0.81,2.136 0,2.943 l 0.737,0.737 c 0.81,0.811 2.136,0.811 2.945,0 l 8.835,-8.836 c 0.435,-0.434 0.628,-1.017 0.597,-1.588 0.032,-0.569 -0.161,-1.152 -0.596,-1.586 z"),a.on("click",function(e){i.event.stopPropagation(),e.page*T.PAGE_SIZE<e.count&&(e.page++,T.collapseNode(e),T.expandNode(e))}),!O.DISABLE_COUNT){var o=t.filter(function(e){return e.type!==T.NodeTypes.GROUP});o.append("rect").attr("x",T.CountBox.x).attr("y",T.CountBox.y).attr("width",T.CountBox.w).attr("height",T.CountBox.h).attr("class","ppt-count-box"),o.append("text").attr("x",42).attr("y",48).attr("text-anchor","middle").attr("class","ppt-count-text")}t.filter(function(e){return e.type===T.NodeTypes.CHOOSE}).append("g").attr("class","ppt-g-node-ban").append("path").attr("d","M89.1 19.2C88 17.7 86.6 16.2 85.2 14.8 83.8 13.4 82.3 12 80.8 10.9 72 3.9 61.3 0 50 0 36.7 0 24.2 5.4 14.8 14.8 5.4 24.2 0 36.7 0 50c0 11.4 3.9 22.1 10.9 30.8 1.2 1.5 2.5 3 3.9 4.4 1.4 1.4 2.9 2.7 4.4 3.9C27.9 96.1 38.6 100 50 100 63.3 100 75.8 94.6 85.2 85.2 94.6 75.8 100 63.3 100 50 100 38.7 96.1 28 89.1 19.2ZM11.9 50c0-10.2 4-19.7 11.1-27C30.3 15.9 39.8 11.9 50 11.9c8.2 0 16 2.6 22.4 7.3L19.3 72.4C14.5 66 11.9 58.2 11.9 50Zm65 27c-7.2 7.1-16.8 11.1-27 11.1-8.2 0-16-2.6-22.4-7.4L80.8 27.6C85.5 34 88.1 41.8 88.1 50c0 10.2-4 19.7-11.1 27z")},T.updateElements=function(){var e=O.svg.select("#"+T.gID).selectAll(".ppt-gnode");e.attr("id",function(e){return"popoto-gnode_"+e.id}),O.USE_VORONOI_LAYOUT&&e.attr("clip-path",function(e){return"url(#voroclip-"+e.id+")"}),e.select("defs").select("clipPath").attr("id",function(e){return"node-view"+e.id}).selectAll("circle").attr("r",function(e){return b.node.getSize(e)}),e.filter(function(e){return e.type!==T.NodeTypes.ROOT}).call(i.drag().on("start",function(e){i.event.active||O.force.alphaTarget(.3).restart();e.fx=e.x,e.fy=e.y}).on("drag",function(e){e.fx=i.event.x,e.fy=i.event.y}).on("end",function(e){i.event.active||O.force.alphaTarget(0);!1===e.fixed&&(e.fx=null,e.fy=null)})),T.updateBackgroundElements(),T.updateMiddlegroundElements(),T.updateForegroundElements()},T.updateBackgroundElements=function(){var e=O.svg.select("#"+T.gID).selectAll(".ppt-gnode").selectAll(".ppt-g-node-background");e.select(".ppt-donut-labels").selectAll("*").remove(),e.select(".ppt-donut-segments").selectAll("*").remove();var t=e.select(".ppt-donut-segments").selectAll(".ppt-segment-container").data(function(e){var t=[];return e.hasOwnProperty("relationships")&&(t=e.relationships),t},function(e){return e.id}).enter().append("g").attr("class",".ppt-segment-container").on("click",T.segmentClick).on("mouseover",function(e){i.select(this).select(".ppt-text-arc").classed("hover",!0)}).on("mouseout",function(e){i.select(this).select(".ppt-text-arc").classed("hover",!1)});t.append("title").attr("class","ppt-svg-title").text(function(e){return e.label+" "+e.target}),e.select(".ppt-donut-labels").selectAll(".ppt-segment-container").data(function(e){var t=[];return e.hasOwnProperty("relationships")&&(t=e.relationships),t},function(e){return e.id}).enter().append("g").attr("class",".ppt-segment-container").on("click",T.segmentClick).on("mouseover",function(e){i.select(this).select(".ppt-text-arc").classed("hover",!0)}).on("mouseout",function(e){i.select(this).select(".ppt-text-arc").classed("hover",!1)}).append("path").attr("class","ppt-hidden-arc").attr("id",function(e,t){return"arc_"+i.select(this.parentNode.parentNode).datum().id+"_"+t}).attr("d",function(e){var t=i.select(this.parentNode.parentNode).datum(),n={startAngle:e.directionAngle-(Math.PI-.1),endAngle:e.directionAngle+(Math.PI-.1)},r=i.arc().innerRadius(T.getDonutInnerRadius(t)).outerRadius(T.getDonutOuterRadius(t))(n),a=/(^.+?)L/.exec(r);return(a&&1<a.length?a[1]:/(^.+?)M/.exec(r)[1]).replace(/,/g," ")}).style("fill","none").style("stroke","none"),t.append("text").attr("text-anchor","middle").attr("class",function(e){var t=i.select(this.parentNode.parentNode).datum();return t.hasOwnProperty("count")&&0===t.count?"ppt-text-arc disabled":"ppt-text-arc"}).attr("fill",function(e){var t=i.select(this.parentNode.parentNode).datum();return b.link.getColor({label:e.label,type:O.link.LinkTypes.SEGMENT,source:t,target:{label:e.target}},"segment","fill")}).attr("dy",O.link.TEXT_DY).append("textPath").attr("startOffset","50%").attr("xlink:href",function(e,t){return"#arc_"+i.select(this.parentNode.parentNode.parentNode).datum().id+"_"+t}).text(function(e){var t=i.select(this.parentNode.parentNode.parentNode).datum();return b.link.getTextValue({source:t,target:{label:e.target},label:e.label,type:O.link.LinkTypes.SEGMENT})}),t.append("path").attr("class",function(e){var t=i.select(this.parentNode.parentNode).datum();return t.hasOwnProperty("count")&&0===t.count?"ppt-segment disabled":"ppt-segment"}).attr("d",function(e){var t=i.select(this.parentNode.parentNode).datum();return i.arc().innerRadius(T.getDonutInnerRadius(t)).outerRadius(T.getDonutOuterRadius(t))(e)}).attr("fill",function(e){var t=i.select(this.parentNode.parentNode).datum();return b.link.getColor({label:e.label,type:O.link.LinkTypes.RELATION,source:t,target:{label:e.target}},"path","fill")}).attr("stroke",function(e){var t=i.select(this.parentNode.parentNode).datum();return b.link.getColor({label:e.label,type:O.link.LinkTypes.RELATION,source:t,target:{label:e.target}},"path","stroke")})},T.updateMiddlegroundElements=function(){var e=O.svg.select("#"+T.gID).selectAll(".ppt-gnode").selectAll(".ppt-g-node-middleground");e.attr("clip-path",function(e){return"url(#node-view"+e.id+")"}),e.selectAll("*").remove(),T.updateMiddlegroundElementsTooltip(e),T.updateMiddlegroundElementsText(e.filter(function(e){return b.node.getNodeDisplayType(e)===b.node.DisplayTypes.TEXT})),T.updateMiddlegroundElementsImage(e.filter(function(e){return b.node.getNodeDisplayType(e)===b.node.DisplayTypes.IMAGE})),T.updateMiddlegroundElementsSymbol(e.filter(function(e){return b.node.getNodeDisplayType(e)===b.node.DisplayTypes.SYMBOL})),T.updateMiddlegroundElementsSVG(e.filter(function(e){return b.node.getNodeDisplayType(e)===b.node.DisplayTypes.SVG})),T.updateMiddlegroundElementsDisplayedText(e.filter(function(e){return b.node.isTextDisplayed(e)}))},T.updateMiddlegroundElementsTooltip=function(e){e.append("title").attr("class",function(e){return b.node.getCSSClass(e,"title")}).text(function(e){return b.node.getTextValue(e,T.NODE_TITLE_MAX_CHARS)})},T.updateMiddlegroundElementsText=function(e){e.append("circle").attr("r",function(e){return b.node.getSize(e)}).attr("class",function(e){return b.node.getCSSClass(e,"circle")}).attr("fill",function(e){return b.node.getColor(e,"circle","fill")}).attr("stroke",function(e){return b.node.getColor(e,"circle","stroke")})},T.updateMiddlegroundElementsImage=function(e){e.append("circle").attr("r",function(e){return b.node.getSize(e)}).attr("class",function(e){return b.node.getCSSClass(e,"image-background-circle")}),e.append("image").attr("class",function(e){return b.node.getCSSClass(e,"image")}).attr("width",function(e){return b.node.getImageWidth(e)}).attr("height",function(e){return b.node.getImageHeight(e)}).attr("transform",function(e){return"translate("+-b.node.getImageWidth(e)/2+","+-b.node.getImageHeight(e)/2+")"}).attr("xlink:href",function(e){return b.node.getImagePath(e)})},T.updateMiddlegroundElementsSymbol=function(e){e.append("circle").attr("r",function(e){return b.node.getSize(e)}).attr("class",function(e){return b.node.getCSSClass(e,"symbol-background-circle")}).attr("fill",function(e){return b.node.getColor(e,"circle","fill")}).attr("stroke",function(e){return b.node.getColor(e,"circle","stroke")}),e.append("use").attr("class",function(e){return b.node.getCSSClass(e,"symbol")}).attr("width",function(e){return b.node.getImageWidth(e)}).attr("height",function(e){return b.node.getImageHeight(e)}).attr("transform",function(e){return"translate("+-b.node.getImageWidth(e)/2+","+-b.node.getImageHeight(e)/2+")"}).attr("xlink:href",function(e){return b.node.getImagePath(e)}).attr("fill",function(e){return b.node.getColor(e,"circle","fill")}).attr("stroke",function(e){return b.node.getColor(e,"circle","stroke")})},T.updateMiddlegroundElementsSVG=function(e){var t=e.append("g"),n=(t.append("circle").attr("r",function(e){return b.node.getSize(e)}).attr("class","ppt-svg-node-background"),t.selectAll("path").data(function(e){return b.node.getSVGPaths(e)}));n.exit().remove(),n.enter().append("path"),t.selectAll("path").attr("class",function(e){var t=i.select(this.parentNode).datum();return b.node.getCSSClass(t,"path")}).each(function(e,t){for(var n in e)e.hasOwnProperty(n)&&i.select(this).attr(n,e[n])})},T.updateMiddlegroundElementsDisplayedText=function(e){var t=e.filter(function(e){return b.node.isTextDisplayed(e)});O.USE_FIT_TEXT?N.render(t):R.render(t)},T.updateForegroundElements=function(){var e=O.svg.select("#"+T.gID).selectAll(".ppt-gnode").selectAll(".ppt-g-node-foreground").selectAll(".ppt-node-foreground-g-arrows");e.classed("active",function(e){return e.valueExpanded&&e.data&&e.data.length>T.PAGE_SIZE}),e.selectAll(".ppt-larrow").classed("enabled",function(e){return 1<e.page}),e.selectAll(".ppt-rarrow").classed("enabled",function(e){if(e.data){var t=e.data.length;return e.page*T.PAGE_SIZE<t}return!1});var t=O.svg.select("#"+T.gID).selectAll(".ppt-gnode").selectAll(".ppt-g-node-foreground");t.selectAll(".ppt-count-box").filter(function(e){return e.type!==T.NodeTypes.CHOOSE}).classed("root",!0),t.selectAll(".ppt-count-box").filter(function(e){return e.type===T.NodeTypes.CHOOSE}).classed("value",!0),t.selectAll(".ppt-count-box").classed("disabled",function(e){return 0===e.count}),O.DISABLE_COUNT||t.selectAll(".ppt-count-text").text(function(e){return null!==e.count?e.count:"..."}).classed("disabled",function(e){return 0===e.count}),O.svg.select("#"+T.gID).selectAll(".ppt-gnode").selectAll(".ppt-g-node-foreground").filter(function(e){return!0===e.isNegative}).selectAll(".ppt-g-node-ban").attr("transform",function(e){return"translate("+-b.node.getSize(e)+","+-b.node.getSize(e)+") scale("+2*b.node.getSize(e)/100+")"}).attr("stroke-width",function(e){return 2/(2*b.node.getSize(e)/100)+"px"}),O.svg.select("#"+T.gID).selectAll(".ppt-gnode").selectAll(".ppt-g-node-foreground").selectAll(".ppt-g-node-ban").classed("active",function(e){return!0===e.isNegative})},T.segmentClick=function(e){i.event.preventDefault();var t=i.select(this.parentNode.parentNode).datum();O.ignoreCount=!0,O.addRelationshipData(t,e,function(t){O.notifyListeners(O.Events.GRAPH_NODE_RELATION_ADD,[m.links.filter(function(e){return e.target===t})]),O.ignoreCount=!1,O.hasGraphChanged=!0,f()})},T.mouseOverNode=function(){i.event.preventDefault();var t=i.select(this).data()[0];L.isActive&&(L.queryConstraintSpanElements.filter(function(e){return e.ref===t}).classed("hover",!0),L.querySpanElements.filter(function(e){return e.ref===t}).classed("hover",!0)),S.isActive&&S.querySpanElements.filter(function(e){return e.node===t}).classed("hover",!0)},T.mouseOutNode=function(){i.event.preventDefault();var t=i.select(this).data()[0];L.isActive&&(L.queryConstraintSpanElements.filter(function(e){return e.ref===t}).classed("hover",!1),L.querySpanElements.filter(function(e){return e.ref===t}).classed("hover",!1)),S.isActive&&S.querySpanElements.filter(function(e){return e.node===t}).classed("hover",!1)},T.nodeClick=function(){if(!i.event.defaultPrevented){var e=i.select(this).data()[0];if(p.debug("nodeClick ("+e.label+")"),e.type===T.NodeTypes.VALUE)T.valueNodeClick(e);else if(e.type===T.NodeTypes.CHOOSE||e.type===T.NodeTypes.ROOT)if(i.event.ctrlKey){if(e.type===T.NodeTypes.CHOOSE){if(e.isNegative=!e.hasOwnProperty("isNegative")||!e.isNegative,T.collapseAllNode(),e.hasOwnProperty("value")&&0<e.value.length);else if(e.isNegative){for(var t=m.links.length-1;0<=t;t--)m.links[t].source===e&&T.removeNode(m.links[t].target);e.count=0}g.hasChanged=!0,O.hasGraphChanged=!0,f()}}else e.valueExpanded?T.collapseNode(e):T.chooseNodeClick(e)}},T.collapseNode=function(t){if(t.valueExpanded){p.debug("collapseNode ("+t.label+")"),O.notifyListeners(O.Events.GRAPH_NODE_VALUE_COLLAPSE,[t]);var e=m.links.filter(function(e){return e.source===t&&e.type===O.link.LinkTypes.VALUE});e.forEach(function(e){m.nodes.splice(m.nodes.indexOf(e.target),1)});for(var n=m.links.length-1;0<=n;n--)0<=e.indexOf(m.links[n])&&m.links.splice(n,1);t.type!==T.NodeTypes.ROOT&&(t.fixed=!1,t.fx=null,t.fy=null),t.parent&&t.parent.type!==T.NodeTypes.ROOT&&(t.parent.fixed=!1,t.parent.fx=null,t.parent.fy=null),t.valueExpanded=!1,f()}else p.debug("collapseNode called on an unexpanded node")},T.collapseAllNode=function(){m.nodes.forEach(function(e){e.type!==T.NodeTypes.CHOOSE&&e.type!==T.NodeTypes.ROOT||!e.valueExpanded||T.collapseNode(e)})},T.valueNodeClick=function(e){p.debug("valueNodeClick ("+e.label+")"),O.notifyListeners(O.Events.GRAPH_NODE_ADD_VALUE,[e]),void 0===e.parent.value&&(e.parent.value=[]),e.parent.value.push(e),g.hasChanged=!0,O.hasGraphChanged=!0,T.collapseNode(e.parent)},T.chooseNodeClick=function(a){if(p.debug("chooseNodeClick ("+a.label+") with waiting state set to "+T.chooseWaiting),!T.chooseWaiting&&!a.immutable&&0!==a.count)if(T.collapseAllNode(),T.chooseWaiting=!0,void 0!==a.data&&a.isAutoLoadValue)a.page=1,T.expandNode(a),T.chooseWaiting=!1;else{p.info("Values ("+a.label+") ==>");var e=A.generateNodeValueQuery(a);c.post({statements:[{statement:e.statement,parameters:e.parameters}]}).done(function(e){p.info("<== Values ("+a.label+")");var t=c.response.parse(e),r=b.node.getConstraintAttribute(a.label);a.data=t[0].filter(function(t){var n=!0;return a.hasOwnProperty("value")&&0<a.value.length&&a.value.forEach(function(e){e.attributes[r]===t[r]&&(n=!1)}),n}),a.page=1,T.expandNode(a),T.chooseWaiting=!1}).fail(function(e,t,n){T.chooseWaiting=!1,p.error(t+': error while accessing Neo4j server on URL:"'+c.CYPHER_URL+'" defined in "rest.CYPHER_URL" property: '+n)})}},T.addExpandedValue=function(e,t){for(var n=!1,r=m.nodes.length-1;0<=r;r--)if(m.nodes[r].valueExpanded){for(var a=m.nodes[r].data.length-1;0<=a;a--)m.nodes[r].data[a][e]===t&&(n=!0,m.nodes[r].hasOwnProperty("value")||(m.nodes[r].value=[]),m.nodes[r].value.push({attributes:m.nodes[r].data[a]}),m.nodes[r].data.splice(a,1));T.collapseNode(m.nodes[r]),T.expandNode(m.nodes[r])}n&&(g.hasChanged=!0,O.hasGraphChanged=!0,f())},T.getContainingValue=function(n){var r=[],e=m.links,t=m.nodes;if(0<t.length){var a=t[0];void 0!==a.value&&0<a.value.length&&(void 0!==n&&n!==a.label||r.push(a)),e.forEach(function(e){var t=e.target;e.type===O.link.LinkTypes.RELATION&&void 0!==t.value&&0<t.value.length&&(void 0!==n&&n!==t.label||r.push(t))})}return r},T.addValueForLabel=function(e,t){for(var n=!1,r=m.nodes.length-1;0<=r;r--)if(m.nodes[r].type===T.NodeTypes.CHOOSE&&m.nodes[r].label===e){m.nodes[r].hasOwnProperty("value")||(m.nodes[r].value=[]);var a=!1,o=b.node.getConstraintAttribute(e);m.nodes[r].value.forEach(function(e){e.attributes.hasOwnProperty(o)&&e.attributes[o]===t.attributes[o]&&(a=!0)}),a||(m.nodes[r].value.push(t),n=!0)}return n},T.addValue=function(e,t){for(var n=!1,r=0;r<m.nodes.length;r++){var a=m.nodes[r];if(0<=e.indexOf(a.id)){a.hasOwnProperty("value")||(a.value=[]);var o=b.node.getReturnAttributes(a.label)[0];a.data.forEach(function(e){e.hasOwnProperty(o)&&e[o]===t&&(n=!0,a.value.push({attributes:e}))})}}n&&(g.hasChanged=!0,O.hasGraphChanged=!0,f())},T.removeValue=function(e,t){var n=!1;T.collapseNode(e);for(var r=e.value.length-1;0<=r;r--)e.value[r]===t&&(e.value.splice(r,1),n=!0);return n},T.removeValues=function(e){var t=!1;return T.collapseNode(e),void 0!==e.value&&0<e.value.length&&(t=!(e.value.length=0)),t},T.getValue=function(e,t){for(var n=0;n<m.nodes.length;n++){var r=m.nodes[n];if(r.id===e)for(var a=b.node.getConstraintAttribute(r.label),o=r.value.length-1;0<=o;o--)if(r.value[o].attributes[a]===t)return r.value[o]}},T.removeExpandedValue=function(e,t){for(var n=!1,r=m.nodes.length-1;0<=r;r--)if(m.nodes[r].valueExpanded){for(var a=[],o=m.nodes[r].value.length-1;0<=o;o--)m.nodes[r].value[o].attributes[e]===t&&(n=!0,a=a.concat(m.nodes[r].value.splice(o,1)));for(var l=0;l<a.length;l++)m.nodes[r].data.push(a[l].attributes);T.collapseNode(m.nodes[r]),T.expandNode(m.nodes[r])}n&&(g.hasChanged=!0,O.hasGraphChanged=!0,f())},T.getAutoLoadValueNodes=function(){return m.nodes.filter(function(e){return e.hasOwnProperty("isAutoLoadValue")&&!0===e.isAutoLoadValue&&!(!0===e.isNegative)})},T.addRelatedValues=function(u,e,d){var t=T.filterExistingValues(u,e);if(!(t.length<=0)){var o=[];t.forEach(function(e){var t=b.node.getConstraintAttribute(e.label),n="MATCH ";t===A.NEO4J_INTERNAL_ID?n+="(v:`"+e.label+"`) WHERE (ID(v) = $p)":n+="(v:`"+e.label+"`) WHERE (v."+t+" = $p)";var r=b.node.getReturnAttributes(e.label),a="";n+=' RETURN DISTINCT "'+e.rel+'" AS rel, "'+e.label+'" AS label, {'+r.reduce(function(e,t){return e+=a+t+":v."+t,a=", ",e},"")+"} AS value LIMIT 1",o.push({statement:n,parameters:{p:e.id},resultDataContents:["row"]})}),p.info("addRelatedValues ==>"),c.post({statements:o}).done(function(e){p.info("<== addRelatedValues");var i=c.response.parse(e),s=0;i.forEach(function(e){if(0<e.length){var t=e[0].label,n=e[0].value,r=e[0].rel,a={id:m.generateId(),parent:u,attributes:n,type:T.NodeTypes.VALUE,label:t};O.ignoreCount=!0;var o=u.relationships.filter(function(e){return e.label===r&&e.target===t}),l={label:r,target:t};0<o.length&&(l=o[0]),O.addRelationshipData(u,l,function(){++s===i.length&&(O.ignoreCount=!1,O.hasGraphChanged=!0,g.hasChanged=!0,f())},[a],d)}})}).fail(function(e,t,n){console.error(e,t,n)})}},T.addRelatedBranch=function(e,t,n,r){if(0<t.length){var a=t[0];t=t.slice(1);var o=e.relationships.filter(function(e){return e.label===a.type&&e.target===a.target});0<o.length&&O.addRelationshipData(e,o[0],function(e){T.addRelatedBranch(e,t,n,r)})}else T.addRelatedValues(e,n,r)},T.filterExistingValues=function(e,t){var a=[],o=m.nodes.filter(function(e){return e.parent===e&&e.hasOwnProperty("value")&&0<e.value.length});return t.forEach(function(t){var n=!1,r=b.node.getConstraintAttribute(t.label);o.forEach(function(e){e.label===t.label&&e.value.forEach(function(e){e.attributes[r]===t.id&&(n=!0)})}),n||a.push(t)}),a},T.expandNode=function(o){O.notifyListeners(O.Events.GRAPH_NODE_VALUE_EXPAND,[o]);var e=o.page*T.PAGE_SIZE,t=e-T.PAGE_SIZE,l=o.data.slice(t,e),i=O.computeParentAngle(o),s=1;l.forEach(function(e){var t;t=o.parent?360/(l.length+1)*s:360/l.length*s;var n=o