statistics.js
Home
/
src /
webvowl /
js /
modules /
statistics.js
var SetOperatorNode = require("../elements/nodes/SetOperatorNode");
var OwlThing = require("../elements/nodes/implementations/OwlThing");
var OwlNothing = require("../elements/nodes/implementations/OwlNothing");
var elementTools = require("../util/elementTools")();
module.exports = function (){
var statistics = {},
nodeCount,
occurencesOfClassAndDatatypeTypes = {},
edgeCount,
occurencesOfPropertyTypes = {},
classCount,
datatypeCount,
datatypePropertyCount,
objectPropertyCount,
propertyCount,
totalIndividualCount,
filteredNodes,
filteredProperties;
statistics.filter = function ( classesAndDatatypes, properties ){
resetStoredData();
storeTotalCounts(classesAndDatatypes, properties);
storeClassAndDatatypeCount(classesAndDatatypes);
storePropertyCount(properties);
storeOccurencesOfTypes(classesAndDatatypes, occurencesOfClassAndDatatypeTypes);
storeOccurencesOfTypes(properties, occurencesOfPropertyTypes);
storeTotalIndividualCount(classesAndDatatypes);
filteredNodes = classesAndDatatypes;
filteredProperties = properties;
};
function resetStoredData(){
nodeCount = 0;
edgeCount = 0;
classCount = 0;
datatypeCount = 0;
datatypePropertyCount = 0;
objectPropertyCount = 0;
propertyCount = 0;
totalIndividualCount = 0;
}
function storeTotalCounts( classesAndDatatypes, properties ){
nodeCount = classesAndDatatypes.length;
var seenProperties = require("../util/set")(), i, l, property;
for ( i = 0, l = properties.length; i < l; i++ ) {
property = properties[i];
if ( !seenProperties.has(property) ) {
edgeCount += 1;
}
seenProperties.add(property);
if ( property.inverse() ) {
seenProperties.add(property.inverse());
}
}
}
function storeClassAndDatatypeCount( classesAndDatatypes ){
// Each datatype should be counted just a single time
var datatypeSet = d3.set(),
hasThing = false,
hasNothing = false;
classCount = 0;
var old = 0, newcc = 0;
classesAndDatatypes.forEach(function ( node ){
if ( elementTools.isDatatype(node) ) {
datatypeSet.add(node.defaultLabel());
} else if ( !(node instanceof SetOperatorNode) ) {
if ( node instanceof OwlThing ) {
hasThing = true;
} else if ( node instanceof OwlNothing ) {
hasNothing = true;
} else {
old = classCount;
var adds = 1 + countElementArray(node.equivalents());
classCount += adds;
newcc = classCount;
}
} else if ( node instanceof SetOperatorNode ) {
old = classCount;
classCount += 1;
newcc = classCount;
}
});
// count things and nothings just a single time
// classCount += hasThing ? 1 : 0;
// classCount += hasNothing ? 1 : 0;
datatypeCount = datatypeSet.size();
}
function storePropertyCount( properties ){
for ( var i = 0, l = properties.length; i < l; i++ ) {
var property = properties[i];
var attr;
var result = false;
if ( property.attributes ) {
attr = property.attributes();
if ( attr && attr.indexOf("datatype") !== -1 ) {
result = true;
}
}
if ( result === true ) {
datatypePropertyCount += getExtendedPropertyCount(property);
} else if ( elementTools.isObjectProperty(property) ) {
objectPropertyCount += getExtendedPropertyCount(property);
}
}
propertyCount = objectPropertyCount + datatypePropertyCount;
}
function getExtendedPropertyCount( property ){
// count the property itself
var count = 1;
// and count properties this property represents
count += countElementArray(property.equivalents());
count += countElementArray(property.redundantProperties());
return count;
}
function countElementArray( properties ){
if ( properties ) {
return properties.length;
}
return 0;
}
function storeOccurencesOfTypes( elements, storage ){
elements.forEach(function ( element ){
var type = element.type(),
typeCount = storage[type];
if ( typeof typeCount === "undefined" ) {
typeCount = 0;
} else {
typeCount += 1;
}
storage[type] = typeCount;
});
}
function storeTotalIndividualCount( nodes ){
var sawIndividuals = {};
var totalCount = 0;
for ( var i = 0, l = nodes.length; i < l; i++ ) {
var individuals = nodes[i].individuals();
var tempCount = 0;
for ( var iA = 0; iA < individuals.length; iA++ ) {
if ( sawIndividuals[individuals[iA].iri()] === undefined ) {
sawIndividuals[individuals[iA].iri()] = 1; // this iri for that individual is now set to 1 >> seen it
tempCount++;
}
}
totalCount += tempCount;
}
totalIndividualCount = totalCount;
sawIndividuals = {}; // clear the object
}
statistics.nodeCount = function (){
return nodeCount;
};
statistics.occurencesOfClassAndDatatypeTypes = function (){
return occurencesOfClassAndDatatypeTypes;
};
statistics.edgeCount = function (){
return edgeCount;
};
statistics.occurencesOfPropertyTypes = function (){
return occurencesOfPropertyTypes;
};
statistics.classCount = function (){
return classCount;
};
statistics.datatypeCount = function (){
return datatypeCount;
};
statistics.datatypePropertyCount = function (){
return datatypePropertyCount;
};
statistics.objectPropertyCount = function (){
return objectPropertyCount;
};
statistics.propertyCount = function (){
return propertyCount;
};
statistics.totalIndividualCount = function (){
return totalIndividualCount;
};
// Functions a filter must have
statistics.filteredNodes = function (){
return filteredNodes;
};
statistics.filteredProperties = function (){
return filteredProperties;
};
return statistics;
};