/** * Contains the logic for the export button. * @returns {{}} */ module.exports = function ( graph ){ var exportTTLModule = {}; var resultingTTLContent = ""; var currentNodes; var currentProperties; var currentAxioms; var Map_ID2Node = {}; var Map_ID2Prop = {}; var prefixModule = webvowl.util.prefixTools(graph); exportTTLModule.requestExport = function (){ prefixModule.updatePrefixModel(); resultingTTLContent = ""; currentNodes = graph.getClassDataForTtlExport(); var i; for ( i = 0; i < currentNodes.length; i++ ) { Map_ID2Node[currentNodes[i].id()] = currentNodes[i]; } currentProperties = graph.getPropertyDataForTtlExport(); for ( i = 0; i < currentProperties.length; i++ ) { Map_ID2Prop[currentProperties[i].id()] = currentProperties[i]; } prepareHeader(); preparePrefixList(); prepareOntologyDef(); resultingTTLContent += "#################################################################\r\n\r\n"; preparePrefixRepresentation(); var property_success = exportProperties(); var class_success = exportClasses(); currentNodes = null; currentProperties = null; Map_ID2Node = {}; Map_ID2Prop = {}; if ( property_success === false || class_success === false ) return false; return true; }; function preparePrefixRepresentation(){ var i; var allNodes = graph.getUnfilteredData().nodes; var allProps = graph.getUnfilteredData().properties; for ( i = 0; i < allNodes.length; i++ ) { var nodeIRI = prefixModule.getPrefixRepresentationForFullURI(allNodes[i].iri()); if ( prefixModule.validURL(nodeIRI) === true ) allNodes[i].prefixRepresentation = "<" + nodeIRI + ">"; else allNodes[i].prefixRepresentation = nodeIRI; } for ( i = 0; i < allProps.length; i++ ) { var propIRI = prefixModule.getPrefixRepresentationForFullURI(allProps[i].iri()); if ( prefixModule.validURL(propIRI) === true ) allProps[i].prefixRepresentation = "<" + propIRI + ">"; else allProps[i].prefixRepresentation = propIRI; } } function exportProperties(){ if ( currentProperties.length === 0 ) return; // we dont need to write that resultingTTLContent += "### Property Definitions (Number of Property) " + currentProperties.length + " ###\r\n"; for ( var i = 0; i < currentProperties.length; i++ ) { resultingTTLContent += "# --------------------------- Property " + i + "------------------------- \r\n"; var addedElement = extractPropertyDescription(currentProperties[i]); resultingTTLContent += addedElement; //@ workaround for not supported elements if ( addedElement.indexOf("WHYEMPTYNAME") !== -1 ) { return false; } } return true; } function exportClasses(){ if ( currentNodes.length === 0 ) return; // we dont need to write that resultingTTLContent += "### Class Definitions (Number of Classes) " + currentNodes.length + " ###\r\n"; for ( var i = 0; i < currentNodes.length; i++ ) { // check for node type here and return false resultingTTLContent += "# --------------------------- Class " + i + "------------------------- \r\n"; var addedElement = extractClassDescription(currentNodes[i]); resultingTTLContent += addedElement; if ( addedElement.indexOf("WHYEMPTYNAME") !== -1 ) { return false; } } return true; } function getPresentAttribute( selectedElement, element ){ var attr = selectedElement.attributes(); return (attr.indexOf(element) >= 0); } function extractClassDescription( node ){ var subject = node.prefixRepresentation; var predicate = "rdf:type"; var object = node.type(); if ( node.type() === "owl:equivalentClass" ) object = "owl:Class"; if ( node.type() === "owl:disjointUnionOf" ) object = "owl:Class"; if ( node.type() === "owl:unionOf" ) object = "owl:Class"; var arrayOfNodes = []; var arrayOfUnionNodes = []; if ( node.union() ) { var union = node.union(); for ( var u = 0; u < union.length; u++ ) { var u_node = Map_ID2Node[union[u]]; arrayOfUnionNodes.push(u_node); } } if ( node.disjointUnion() ) { var distUnion = node.disjointUnion(); for ( var du = 0; du < distUnion.length; du++ ) { var du_node = Map_ID2Node[distUnion[du]]; arrayOfNodes.push(du_node); } } var objectDef = subject + " " + predicate + " " + object; if ( getPresentAttribute(node, "deprecated") === true ) { objectDef += ", owl:DeprecatedProperty"; } // equivalent class handeled using type itself! // check for equivalent classes; var indent = getIndent(subject); objectDef += "; \r\n"; for ( var e = 0; e < node.equivalents().length; e++ ) { var eqIRI = prefixModule.getPrefixRepresentationForFullURI(node.equivalents()[e].iri()); var eqNode_prefRepresentation = ""; if ( prefixModule.validURL(eqIRI) === true ) eqNode_prefRepresentation = "<" + eqIRI + ">"; else eqNode_prefRepresentation = eqIRI; objectDef += indent + " owl:equivalentClass " + eqNode_prefRepresentation + " ;\r\n"; } // if (getPresentAttribute(node,"equivalent")===true){ // objectDef+=", owl:EquivalentClass"; // } // add Comments if ( node.commentForCurrentLanguage() ) { objectDef += indent + " rdfs:comment \"" + node.commentForCurrentLanguage() + "\" ;\r\n"; } if ( node.annotations() ) { var annotations = node.annotations(); for ( var an in annotations ) { if ( annotations.hasOwnProperty(an) ) { var anArrayObj = annotations[an]; var anObj = anArrayObj[0]; var an_ident = anObj.identifier; var an_val = anObj.value; if ( an_ident === "isDefinedBy" ) { objectDef += indent + " rdfs:isDefinedBy <" + an_val + "> ;\r\n"; } if ( an_ident === "term_status" ) { objectDef += indent + " vs:term_status \"" + an_val + "\" ;\r\n"; } } } } if ( arrayOfNodes.length > 0 ) { // add disjoint unionOf objectDef += indent + " owl:disjointUnionOf ("; for ( var duE = 0; duE < arrayOfNodes.length; duE++ ) { var duIri = prefixModule.getPrefixRepresentationForFullURI(arrayOfNodes[duE].iri()); var duNode_prefRepresentation = ""; if ( prefixModule.validURL(duIri) === true ) duNode_prefRepresentation = "<" + duIri + ">"; else duNode_prefRepresentation = duIri; objectDef += indent + indent + duNode_prefRepresentation + " \n"; } objectDef += ") ;\r\n"; } if ( arrayOfUnionNodes.length > 0 ) { // add disjoint unionOf objectDef += indent + " rdfs:subClassOf [ rdf:type owl:Class ; \r\n"; objectDef += indent + indent + " owl:unionOf ( "; for ( var uE = 0; uE < arrayOfUnionNodes.length; uE++ ) { if ( arrayOfUnionNodes[uE] && arrayOfUnionNodes[uE].iri() ) { var uIri = prefixModule.getPrefixRepresentationForFullURI(arrayOfUnionNodes[uE].iri()); var uNode_prefRepresentation = ""; if ( prefixModule.validURL(uIri) === true ) uNode_prefRepresentation = "<" + uIri + ">"; else uNode_prefRepresentation = uIri; objectDef += indent + indent + indent + uNode_prefRepresentation + " \n"; } } objectDef += ") ;\r\n"; } var allProps = graph.getUnfilteredData().properties; var myProperties = []; var i; for ( i = 0; i < allProps.length; i++ ) { if ( allProps[i].domain() === node && ( allProps[i].type() === "rdfs:subClassOf" || allProps[i].type() === "owl:allValuesFrom" || allProps[i].type() === "owl:someValuesFrom") ) { myProperties.push(allProps[i]); } // special case disjoint with>> both domain and range get that property if ( (allProps[i].domain() === node) && allProps[i].type() === "owl:disjointWith" ) { myProperties.push(allProps[i]); } } for ( i = 0; i < myProperties.length; i++ ) { // depending on the property we have to do some things; // special case if ( myProperties[i].type() === "owl:someValuesFrom" ) { objectDef += indent + " rdfs:subClassOf [ rdf:type owl:Restriction ; \r\n"; objectDef += indent + " owl:onProperty " + myProperties[i].prefixRepresentation + ";\r\n"; if ( myProperties[i].range().type() !== "owl:Thing" ) { objectDef += indent + " owl:someValuesFrom " + myProperties[i].range().prefixRepresentation + "\r\n"; } objectDef += indent + " ];\r\n"; continue; } if ( myProperties[i].type() === "owl:allValuesFrom" ) { objectDef += indent + " rdfs:subClassOf [ rdf:type owl:Restriction ; \r\n"; objectDef += indent + " owl:onProperty " + myProperties[i].prefixRepresentation + ";\r\n"; if ( myProperties[i].range().type() !== "owl:Thing" ) { objectDef += indent + " owl:allValuesFrom " + myProperties[i].range().prefixRepresentation + "\r\n"; } objectDef += indent + " ];\r\n"; continue; } if ( myProperties[i].range().type() !== "owl:Thing" ) { objectDef += indent + " " + myProperties[i].prefixRepresentation + " " + myProperties[i].range().prefixRepresentation + " ;\r\n"; } } objectDef += general_Label_languageExtractor(indent, node.label(), "rdfs:label", true); return objectDef; } function extractPropertyDescription( property ){ var subject = property.prefixRepresentation; if ( subject.length === 0 ) { console.log("THIS SHOULD NOT HAPPEN"); var propIRI = prefixModule.getPrefixRepresentationForFullURI(property.iri()); console.log("FOUND " + propIRI); } var predicate = "rdf:type"; var object = property.type(); var objectDef = subject + " " + predicate + " " + object; if ( getPresentAttribute(property, "deprecated") === true ) { objectDef += ", owl:DeprecatedProperty"; } if ( getPresentAttribute(property, "functional") === true ) { objectDef += ", owl:FunctionalProperty"; } if ( getPresentAttribute(property, "inverse functional") === true ) { objectDef += ", owl:InverseFunctionalProperty"; } if ( getPresentAttribute(property, "symmetric") === true ) { objectDef += ", owl:SymmetricProperty"; } if ( getPresentAttribute(property, "transitive") === true ) { objectDef += ", owl:TransitiveProperty"; } var indent = getIndent(subject); if ( property.inverse() ) { objectDef += "; \r\n"; objectDef += indent + " owl:inverseOf " + property.inverse().prefixRepresentation; } // check for domain and range; var closeStatement = false; var domain = property.domain(); var range = property.range(); objectDef += " ;\r\n"; if ( property.commentForCurrentLanguage() ) { objectDef += indent + " rdfs:comment \"" + property.commentForCurrentLanguage() + "\" ;\r\n"; } if ( property.superproperties() ) { var superProps = property.superproperties(); for ( var sP = 0; sP < superProps.length; sP++ ) { var sPelement = superProps[sP]; objectDef += indent + "rdfs:subPropertyOf " + sPelement.prefixRepresentation + ";\r\n"; } // for (var an in annotations){ // if (annotations.hasOwnProperty(an)){ // var anArrayObj=annotations[an]; // var anObj=anArrayObj[0]; // var an_ident=anObj.identifier; // var an_val=anObj.value; // console.log(an_ident + " "+ an_val); // // if (an_ident==="isDefinedBy"){ // objectDef+=indent+" rdfs:isDefinedBy <"+an_val+"> ;\r\n"; // } // if (an_ident==="term_status"){ // objectDef+=indent+" vs:term_status \""+an_val+"\" ;\r\n"; // } // } // } } if ( property.annotations() ) { var annotations = property.annotations(); for ( var an in annotations ) { if ( annotations.hasOwnProperty(an) ) { var anArrayObj = annotations[an]; var anObj = anArrayObj[0]; var an_ident = anObj.identifier; var an_val = anObj.value; if ( an_ident === "isDefinedBy" ) { objectDef += indent + " rdfs:isDefinedBy <" + an_val + "> ;\r\n"; } if ( an_ident === "term_status" ) { objectDef += indent + " vs:term_status \"" + an_val + "\" ;\r\n"; } } } } if ( domain.type() === "owl:Thing" && range.type() === "owl:Thing" ) { // we do not write domain and range if ( typeof property.label() !== "object" && property.label().length === 0 ) { closeStatement = true; } } if ( closeStatement === true ) { var uobjectDef = objectDef.substring(0, objectDef.length - 2); objectDef = uobjectDef + " . \r\n"; return objectDef; } // objectDef+="; \r\n"; var labelDescription; if ( domain.type() === "owl:Thing" && range.type() === "owl:Thing" ) { labelDescription = general_Label_languageExtractor(indent, property.label(), "rdfs:label", true); objectDef += labelDescription; } else { // do not close the statement; labelDescription = general_Label_languageExtractor(indent, property.label(), "rdfs:label"); objectDef += labelDescription; if ( domain.type() !== "owl:Thing" ) { objectDef += indent + " rdfs:domain " + domain.prefixRepresentation + ";\r\n"; } if ( range.type() !== "owl:Thing" ) { objectDef += indent + " rdfs:range " + range.prefixRepresentation + ";\r\n"; } // close statement now; var s_needUpdate = objectDef; var s_lastPtr = s_needUpdate.lastIndexOf(";"); objectDef = s_needUpdate.substring(0, s_lastPtr) + " . \r\n"; } return objectDef; } exportTTLModule.resultingTTL_Content = function (){ return resultingTTLContent; }; function getIndent( name ){ if ( name === undefined ) { return "WHYEMPTYNAME?"; } return new Array(name.length + 1).join(" "); } function prepareHeader(){ resultingTTLContent += "#################################################################\r\n"; resultingTTLContent += "### Generated with the experimental alpha version of the TTL exporter of WebVOWL (version 1.1.7) " + " http://visualdataweb.de/webvowl/ ###\r\n"; resultingTTLContent += "#################################################################\r\n\r\n"; } function preparePrefixList(){ var ontoIri = graph.options().getGeneralMetaObjectProperty('iri'); var prefixList = graph.options().prefixList(); var prefixDef = []; prefixDef.push('@prefix : \t\t<' + ontoIri + '> .'); for ( var name in prefixList ) { if ( prefixList.hasOwnProperty(name) ) { prefixDef.push('@prefix ' + name + ': \t\t<' + prefixList[name] + '> .'); } } prefixDef.push('@base \t\t\t<' + ontoIri + '> .\r\n'); for ( var i = 0; i < prefixDef.length; i++ ) { resultingTTLContent += prefixDef[i] + '\r\n'; } } function prepareOntologyDef(){ var ontoIri = graph.options().getGeneralMetaObjectProperty('iri'); var indent = getIndent('<' + ontoIri + '>'); resultingTTLContent += '<' + ontoIri + '> rdf:type owl:Ontology ;\r\n' + getOntologyTitle(indent) + getOntologyDescription(indent) + getOntologyVersion(indent) + getOntologyAuthor(indent); // close the statement; var s_needUpdate = resultingTTLContent; var s_lastPtr = s_needUpdate.lastIndexOf(";"); resultingTTLContent = s_needUpdate.substring(0, s_lastPtr) + " . \r\n"; } function getOntologyTitle( indent ){ return general_languageExtractor(indent, "title", "dc:title"); } function getOntologyDescription( indent ){ return general_languageExtractor(indent, "description", "dc:description"); } function getOntologyAuthor( indent ){ var languageElement = graph.options().getGeneralMetaObjectProperty('author'); if ( languageElement ) { if ( typeof languageElement !== "object" ) { if ( languageElement.length === 0 ) return ""; // an empty string var aString = indent + " dc:creator " + '"' + languageElement + '";\r\n'; return aString; } // we assume this thing is an array; var authorString = indent + " dc:creator " + '"'; for ( var i = 0; i < languageElement.length - 1; i++ ) { authorString += languageElement[i] + ", "; } authorString += languageElement[languageElement.length - 1] + '";\r\n'; return authorString; } else { return ""; // an empty string } } function getOntologyVersion( indent ){ var languageElement = graph.options().getGeneralMetaObjectProperty('version'); if ( languageElement ) { if ( typeof languageElement !== "object" ) { if ( languageElement.length === 0 ) return ""; // an empty string } return general_languageExtractor(indent, "version", "owl:versionInfo"); } else return ""; // an empty string } function general_languageExtractor( indent, metaObjectDescription, annotationDescription, endStatement ){ var languageElement = graph.options().getGeneralMetaObjectProperty(metaObjectDescription); if ( typeof languageElement === 'object' ) { var resultingLanguages = []; for ( var name in languageElement ) { if ( languageElement.hasOwnProperty(name) ) { var content = languageElement[name]; if ( name === "undefined" ) { resultingLanguages.push(indent + " " + annotationDescription + ' "' + content + '"@en; \r\n'); } else { resultingLanguages.push(indent + " " + annotationDescription + ' "' + content + '"@' + name + '; \r\n'); } } } // create resulting titles; var resultingString = ""; for ( var i = 0; i < resultingLanguages.length; i++ ) { resultingString += resultingLanguages[i]; } if ( endStatement && endStatement === true ) { var needUpdate = resultingString; var lastPtr = needUpdate.lastIndexOf(";"); return needUpdate.substring(0, lastPtr) + ". \r\n"; } else { return resultingString; } } else { if ( endStatement && endStatement === true ) { var s_needUpdate = indent + " " + annotationDescription + ' "' + languageElement + '"@en; \r\n'; var s_lastPtr = s_needUpdate.lastIndexOf(";"); return s_needUpdate.substring(0, s_lastPtr) + " . \r\n"; } return indent + " " + annotationDescription + ' "' + languageElement + '"@en;\r\n'; } } function general_Label_languageExtractor( indent, label, annotationDescription, endStatement ){ var languageElement = label; if ( typeof languageElement === 'object' ) { var resultingLanguages = []; for ( var name in languageElement ) { if ( languageElement.hasOwnProperty(name) ) { var content = languageElement[name]; if ( name === "undefined" ) { resultingLanguages.push(indent + " " + annotationDescription + ' "' + content + '"@en; \r\n'); } else { resultingLanguages.push(indent + " " + annotationDescription + ' "' + content + '"@' + name + '; \r\n'); } } } // create resulting titles; var resultingString = ""; for ( var i = 0; i < resultingLanguages.length; i++ ) { resultingString += resultingLanguages[i]; } if ( endStatement && endStatement === true ) { var needUpdate = resultingString; var lastPtr = needUpdate.lastIndexOf(";"); return needUpdate.substring(0, lastPtr) + " . \r\n"; } else { return resultingString; } } else { if ( endStatement && endStatement === true ) { var s_needUpdate = indent + " " + annotationDescription + ' "' + languageElement + '"@en; \r\n'; var s_lastPtr = s_needUpdate.lastIndexOf(";"); return s_needUpdate.substring(0, s_lastPtr) + " . \r\n"; } return indent + " " + annotationDescription + ' "' + languageElement + '"@en; \r\n'; } } return exportTTLModule; };