def requirementAnalysis(fileArchimate=None):

    if fileArchimate is None:
        fileArchimate = u"/Users/morrj140/Documents/SolutionEngineering/Archimate Models/DVC v38.archimate"

    al = ArchiLib(fileArchimate)

    conceptsFile = fileConceptsRequirements

    searchTypes = list()
    searchTypes.append(u"archimate:Requirement")
    nl = al.getTypeNodes(searchTypes)

    logger.info(u"Find Words in Requirements...")
    concepts = Concepts(u"Requirement", u"Requirements")
    n = 0
    for sentence in nl:
        n += 1
        logger.debug(u"%s" % sentence)

        c = concepts.addConceptKeyType(u"Document" + str(n), u"Document")
        d = c.addConceptKeyType(sentence, u"Sentence" + str(n))

        if True and sentence is not None:
            cleanSentence = ' '.join([word for word in sentence.split(u" ") if word not in stop])
            for word, pos in nltk.pos_tag(nltk.wordpunct_tokenize(cleanSentence)):
                if len(word) > 1 and pos[0] == u"N":
                    e = d.addConceptKeyType(word, u"Word")
                    f = e.addConceptKeyType(pos, u"POS")

    Concepts.saveConcepts(concepts, conceptsFile)
    logger.info(u"Saved : %s" % conceptsFile)

    chunks = Chunks(concepts)
    chunks.createChunks()
def test_ArchiCounts(cleandir, fileArchimate):
    assert (os.path.isfile(fileArchimate) is True)

    al = ArchiLib(fileArchimateTest)

    lc = al.logTypeCounts()

    assert (len(lc) > 0)
def createRelations(fileArchimate=fileArchimateTest):

    start_time = ArchiLib.startTimer()

    cr = CreateRelationsInArchi(fileArchimate)

    cr.createRelations()

    ArchiLib.stopTimer(start_time)
def namedEntityAnalysis(fileArchimate=fileArchimateTest, fileConceptsRequirements=fileConceptsRequirements):

    start_time = ArchiLib.startTimer()

    ane = AnalyzeNamedEntities(fileArchimate, fileConceptsRequirements)

    ane.analyzeNamedEntities()

    ArchiLib.stopTimer(start_time)
    def __init__(self, fileArchimate):
        self.fileAchimate = fileArchimate
        self.n = 0
        self.al = ArchiLib(fileArchimate)

        self.start_time = ArchiLib.startTimer()

        self.width = u"120"
        self.height = u"55"
def exportArchi(fileArchimate, fileConceptsExport):

    start_time = ArchiLib.startTimer()

    ea = ExportArchi(fileArchimate, fileConceptsExport)

    ea.exportArchi()

    ArchiLib.stopTimer(start_time)
def exportArchiFolderModels(fileArchimate, fileConceptsExport, folder):

    start_time = ArchiLib.startTimer()

    eafm = ExportArchiFolderModels(fileArchimate, fileConceptsExport)

    eafm.exportArchiFolderModels(folder)

    ArchiLib.stopTimer(start_time)
def analyzeGraph(gdb):
    concepts = None

    start_time = ArchiLib.startTimer()

    ag = AnalyzeGraph(gdb)

    ag.analyzeNetworkX(concepts, fileConceptsExport)

    ArchiLib.stopTimer(start_time)
def createTagCloud(conceptFile, topic):

    start_time = ArchiLib.startTimer()

    concepts = Concepts.loadConcepts(conceptFile)

    tc = TopicCloud(concepts, font_path=u"/Users/morrj140/Fonts/DroidSans.ttf", imageFile=u"Topics.png")

    tc.createTagCloud(topic)

    ArchiLib.stopTimer(start_time)
def exportArchiModel(fileArchimate, fileConceptsExport, model, fileCSVExport):

    start_time = ArchiLib.startTimer()

    eam = ExportArchiModel(fileArchimate, fileConceptsExport, fileCSVExport)

    listMTE = list()
    listMTE.append(model)

    eam.exportArchiModel(listMTE)

    ArchiLib.stopTimer(start_time)
def exportNeo4j(gdb):

    # measure process time, wall time
    start_time = ArchiLib.startTimer()

    concepts = Concepts(u"Neo4J", u"Neo4J Graph DB")

    nj = Neo4JLib(gdb)

    nj.exportNeo4JToConcepts(concepts)

    ArchiLib.stopTimer(start_time)
def dependancyAnalysisFromArchi(fileArchimate):

    start_time = ArchiLib.startTimer()

    da = DependancyAnalysis(fileArchimate)

    concepts, listTSort = da.collectDependancyAnalysisNodes()

    da.dependancyAnalysis(listTSort)

    concepts.logConcepts()

    ArchiLib.stopTimer(start_time)
def importWSDL():

    start_time = ArchiLib.startTimer()

    etree.QName(ArchiLib.ARCHIMATE_NS, u"model")
    treeArchi = etree.parse(fileArchimateTest)

    al = ArchiLib()

    dirWSDL = u"/Users/morrj140/Documents/SolutionEngineering/Jawa/Jawa_v2_rc37"

    for root, dirs, files in os.walk(dirWSDL, topdown=True):
        for name in files:
            nameFile = os.path.join(root, name)
            logger.info(u"Checking File : %s" % name)

            if nameFile[-4:].lower() == u"wsdl":
                nFile = name[:-5]
                logger.info(u"nFile : %s" % nFile)
                tree = etree.parse(nameFile)

                xp = u"//@schemaLocation"
                txp = tree.xpath(xp)

                for x in txp:
                    method = x[4:-4]
                    logger.info(u"x : %s" % method)

                    al.insertTwoColumns(
                        treeArchi, u"Application", u"New Jawa", u"archimate:ApplicationService", nFile, method
                    )

    al.outputXML(treeArchi)

    ArchiLib.stopTimer(start_time)
def createArchimateConcepts(fileArchimate, fileConceptsArch):

    logger.info(u"Using : %s" % fileArchimate)

    concepts = Concepts(fileArchimateModel, u"Archimate")

    al = ArchiLib(fileArchimate)

    al.logTypeCounts()

    #
    # Create Concepts from Archimate
    #
    al.folderConcepts(concepts)
    Concepts.saveConcepts(concepts, fileConceptsArch)
    logger.info(u"Saved concepts to : %s" % fileConceptsArch)
def importConceptsIntoArchi():

    logger.info(u"Using : %s" % fileArchimateTest)

    conceptFile = fileConceptsBatches
    logger.info(u"Loading :" + conceptFile)
    concepts = Concepts.loadConcepts(conceptFile)

    al = ArchiLib()

    # Create Subfolder
    folder = u"Implementation & Migration"
    subfolder = u"Dependancy Analysis - %s" % time.strftime(u"%Y%d%m_%H%M%S")

    attrib = dict()
    attrib[u"id"] = al.getID()
    attrib[u"name"] = subfolder
    al.insertNode(u"folder", folder, attrib)

    logger.info(u"--- Insert Nodes ---")
    insertConceptNode(al, concepts, subfolder)

    logger.info(u"--- Insert Relations ---")
    insertConceptRelation(al, concepts)

    al.outputXMLtoFile(filename=u"import_concepts.archimate")
def organizeFolders(fileArchimate):

    logger.info(u"Using : %s" % fileArchimate)

    al = ArchiLib(fileArchimate)

    for folder in entityFolders:
        pass

    sl = al.logTypeCounts()

    nl = [(x[10:], y) for x, y in sl]

    n = 0
    for k, v in al.dictNodes.items():
        logger.debug(u"%s" % v)

        n += 1

        try:
            af = v[ARCHI_TYPE][10:]

        except KeyError, msg:
            continue

        if af in entityFolders:
            logger.debug(u"%d - %s - %s : %s" % (n, v[NAME], af, entityFolders[af]))
            Add(af)
        else:
            logger.info(u"%d Missing - %s" % (n, af))

        if False:
            # Create Subfolder
            folder = u"Implementation & Migration"
            subfolder = u"Dependancy Analysis - %s" % time.strftime(u"%Y%d%m_%H%M%S")

            attrib = dict()
            attrib[u"id"] = al.getID()
            attrib[u"name"] = subfolder
            al.insertNode(u"folder", folder, attrib)
def test_CreateArchimateConcepts(cleandir, fileArchimate):

    assert (os.path.isfile(fileArchimate) is True)

    logger.info(u"Using : %s" % fileArchimate)

    concepts = Concepts(fileArchimate, u"Archimate")

    al = ArchiLib(fileArchimate)

    lc = al.logTypeCounts()

    assert (len(lc) > 0)

    #
    # Create Concepts from Archimate
    #
    al.folderConcepts(concepts)
    Concepts.saveConcepts(concepts, fileConceptsArch)
    logger.info(u"Saved concepts to : %s" % fileConceptsArch)

    assert (os.path.isfile(fileConceptsArch) is True)
def test_RequirementAnalysis(cleandir, fileArchimate):

    assert (os.path.isfile(filePPTXIn) is True)

    al = ArchiLib(fileArchimate)

    conceptsFile = fileConceptsRequirements

    searchTypes = list()
    searchTypes.append(u"archimate:Requirement")
    nl = al.getTypeNodes(searchTypes)

    logger.info(u"Find Words in Requirements...")
    concepts = Concepts(u"Requirement", u"Requirements")
    n = 0
    for sentence in nl:
        n += 1
        logger.debug(u"%s" % sentence)

        c = concepts.addConceptKeyType(u"Document" + unicode(n), u"Document")
        d = c.addConceptKeyType(sentence, u"Sentence" + unicode(n))

        if True and sentence is not None:
            cleanSentence = ' '.join([word for word in sentence.split(" ") if word not in stop])
            for word, pos in nltk.pos_tag(nltk.wordpunct_tokenize(cleanSentence)):
                if len(word) > 1 and pos[0] == u"N":
                    e = d.addConceptKeyType(word, u"Word")
                    f = e.addConceptKeyType(pos, u"POS")

    Concepts.saveConcepts(concepts, conceptsFile)
    logger.info(u"Saved : %s" % conceptsFile)

    assert (os.path.isfile(conceptsFile) is True)

    chunks = Chunks(concepts)
    chunks.createChunks()

    assert (os.path.isfile(fileConceptsChunks) is True)
def ImportCSVIntoArchi(fileArchimate, folder, subfolder, fileMetaEntity):

    start_time = ArchiLib.startTimer()

    logger.info(u"Using : %s" % fileArchimate)
    al = ArchiLib(fileArchimate)

    _ = al.logTypeCounts(ListOnly=True)

    al.insertNColumns(folder, subfolder, fileMetaEntity, CaseFix=False)

    al.outputXMLtoFile()

    relations = len(al.dictRel)
    nodes = len(al.dictND)

    logger.info(u"----------------------------------------------------------------------------------------")
    logger.info(u"Encountered %d errors and added %d Nodes and %d relations" % (len(al.listErrors), nodes, relations))

    ArchiLib.stopTimer(start_time)
def graphConcepts(conceptFile):

    start_time = ArchiLib.startTimer()

    concepts = Concepts.loadConcepts(conceptFile)
    # concepts.logConcepts()

    # graph = PatternGraph()
    graph = GraphVizGraph()
    # graph = NetworkXGraph(conceptFile[:-2]+u".png")

    graph.addGraphNodes(concepts)
    graph.addGraphEdges(concepts)

    if isinstance(graph, NetworkXGraph):
        graph.saveJSON(concepts)

    if isinstance(graph, GraphVizGraph):
        graph.exportGraph()

    if isinstance(graph, PatternGraph):
        graph.exportGraph()

    ArchiLib.stopTimer(start_time)
from al_lib.Constants import *
from al_lib.ArchiLib import ArchiLib
from al_lib.ConceptsImportArchi import ConceptsImportArchi


def createArchiFromConcepts(fileArchimate, fileConceptsImport, fileArchimateImport):

    logger.info(u"Using : %s" % fileArchimate)
    logger.info(u"Loading :" + fileConceptsImport)

    ic = ConceptsImportArchi(fileArchimate, fileConceptsImport)

    concepts = Concepts.loadConcepts(fileConceptsImport)

    # Create Subfolder
    folder = u"Implementation & Migration"
    subfolder = u"Dependancy Analysis - %s" % time.strftime(u"%Y%d%m_%H%M%S")

    ic.importConcepts(concepts, folder, subfolder)

    ic.exportXML(fileArchimateImport)

if __name__ == u"__main__":
    start_time = ArchiLib.startTimer()

    createArchiFromConcepts(fileArchimateTest, fileConceptsExport, fileArchimateImport)

    ArchiLib.stopTimer(start_time)


def gapSimilarity(fileArchimate, searchTypes):

    lemmatizer = WordNetLemmatizer()

    logger.info(u"Using : %s" % fileArchimate)

    al = ArchiLib(fileArchimate)

    nl = al.getTypeNodes(searchTypes)

    logger.info(u"Find Words...")
    concepts = Concepts(u"Word", u"Topic")

    n = 0
    for sentence in nl:
        n += 1

        if sentence is None:
            continue

        logger.info(u"%s" % sentence)

        c = concepts.addConceptKeyType(u"Document" + str(n), nl[sentence][ARCHI_TYPE])
        d = c.addConceptKeyType(sentence, nl[sentence][ARCHI_TYPE])

        cleanSentence = u' '.join([word for word in sentence.split(u" ") if word not in stop])
        for word, pos in nltk.pos_tag(nltk.wordpunct_tokenize(cleanSentence)):
            if len(word) > 1 and pos[0] == u"N":
                lemmaWord =lemmatizer.lemmatize(word.lower())
                e = d.addConceptKeyType(lemmaWord, u"LemmaWord")
                f = e.addConceptKeyType(pos, u"POS")

    if False:
        concepts.logConcepts()

    if True:
        logger.info(u"Find Collocations...")
        fc = Collocations()
        fc.find_collocations(concepts)

    if True:
        npbt = DocumentsSimilarity(al)

        logger.info(u"Create Topics")
        npbt.createTopics(concepts)

        if True:
            logger.info(u"Find Similarities")

            nc = npbt.findSimilarties()

            logger.debug(u"Topics")
            listTopics = list()
            ncg = npbt.topicConcepts.getConcepts().values()
            for x in ncg:
                logger.info(u"%s[%d]" % (x.name, x.count))
                lt = (x.name, x.count)
                listTopics.append(lt)

            logger.info(u"Topics Sorted")
            with open(u"topic_sort.txt", "wb") as f:
                for x in sorted(listTopics, key=lambda c: abs(c[1]), reverse=False):
                    output = "Topic : %s[%d]" % (x[0], x[1])
                    logger.info(output)
                    f.write(output + os.linesep)
    def outputXMLtoLog(self):
        self.al.outputXMLtoLog()

        ArchiLib.stopTimer(self.start_time)
#!/usr/bin/python
#
# Archimate Counts
#
__author__ = u'morrj140'
__VERSION__ = u'0.3'
import os

from Logger import *
logger = setupLogging(__name__)
logger.setLevel(INFO)

from al_lib.ArchiLib import ArchiLib


if __name__ == u"__main__":

    pathModel = u"/Users/morrj140/Documents/SolutionEngineering/Archimate Models"

    fileArchimateXML = u"DVC v3.17.archimate"

    fileArchimate = pathModel + os.sep + fileArchimateXML

    al = ArchiLib(fileArchimate)

    al.logTypeCounts()
class DrawModels(object):

    fileArchimate= None
    n = None
    al = None
    width = None
    height = None

    def __init__(self, fileArchimate):
        self.fileAchimate = fileArchimate
        self.n = 0
        self.al = ArchiLib(fileArchimate)

        self.start_time = ArchiLib.startTimer()

        self.width = u"120"
        self.height = u"55"

    def createArchimateElement(self, tag, folder, attrib):

        self.al.insertNode(tag, folder, attrib, new=False)
        AE_ID = attrib[ID]

        return AE_ID

    def createArchimateRelations(self, tag, folder, attrib):

        self.al.insertRel(tag, folder, attrib, new=False)
        AR_ID = attrib[ID]

        return AR_ID

    # <element
    #    xsi:type="archimate:ArchimateDiagramModel"
    #    id="66de3166"
    #    name="Info">

    def createDiagramModel(self, tag=None, folder=None, attrib=None):

        if tag is None and folder is None and attrib is None:
            tag = u"element"
            folder = u"Views"
            attrib = dict()
            attrib[NAME] = u"DM-TDO%d" % self.n
            attrib[ARCHI_TYPE] = DIAGRAM_MODEL
            self.al.insertNode(tag, folder, attrib)
            DMO_ID = attrib[ID]
            DMO = self.al.findDiagramModel(attrib[ID])

            if len(DMO) == 1:
                DMO = DMO[0]
            else:
                logger.error(u"Diagram Model Not Found")
                raise LookupError(u"Ops")

            return DMO
        else:
            self.al.insertNode(tag, folder, attrib)
            DMO_ID = attrib[ID]
            DMO = self.al.findDiagramModel(attrib[ID])

            if len(DMO) == 1:
                DMO = DMO[0]
            else:
                logger.error(u"Diagram Model Not Found")
                raise LookupError(u"Ops")

    # <child
    #     xsi:type="archimate:DiagramObject"
    #     id="ffc36ce0"
    #     lineColor="#000000"
    #     textAlignment="2"
    #     fillColor="#00ffff"
    #     archimateElement="4b326945">
    #  </child>

    def createDiagramObject(self, DMO, AE_ID, Bounds):

        tag = u"child"
        attrib = dict()
        attrib[ID] = self.al.getID()
        attrib[ARCHI_TYPE] = DIAGRAM_OBJECT
        attrib[u"lineColor"] = u"#000000"
        attrib[u"textAlignment"] = u"2"
        attrib[u"targetConnections"] = u""
        attrib[u"fillColor"] = u"#ffff00"
        attrib[u"archimateElement"] = AE_ID

        elm = etree.Element(tag, attrib, nsmap=NS_MAP)
        DMO.append(elm)
        DOE = self.al.findDiagramObject(attrib[ID])

        if len(DOE) == 1:
            DOE = DOE[0]
        else:
            logger.error(u"Diagram Object Not Found")
            raise LookupError(u"Ops")

        self.createBounds(DOE, Bounds)

        return DOE

    #
    # Create Bounds in DiagramObject
    # Example:
    #     <bounds
    #     x="162" y="175"
    #     width="120" height="55"
    # />
    def createBounds(self, DOE, attrib):

        tag = u"bounds"
        elm = etree.Element(tag, attrib, nsmap=NS_MAP)
        DOE.insert(0, elm)

    #
    # Create SourceConnections
    # Example:
    #     <sourceConnection
    #     xsi:type="archimate:Connection"
    #     id="592e8439"
    #     lineColor="#b1b1b1"
    #     source="4b59249d"
    #     target="c3fd7d30"
    #     relationship="27d1a38d"/>

    def createConnection(self, DOE1, DOE2, R_ID):

        tag = u"sourceConnection"
        attrib = dict()
        attrib[ARCHI_TYPE] = u"archimate:Connection"
        attrib[u"lineColor"] = u"#b1b1b1"
        attrib[ID] = self.al.getID()
        attrib[u"source"] = DOE1.get(ID)
        attrib[u"target"] = DOE2.get(ID)
        attrib[u"relationship"] = R_ID
        elm = etree.Element(tag, attrib, nsmap=NS_MAP)
        DOE1.insert(0, elm)
        SC_ID = attrib[ID]

        #
        # Aggregate target connectins
        # <child xsi:type="archimate:DiagramObject"
        #             id="52f55838"
        #             lineColor="#000000"
        #             textAlignment="2"
        #             targetConnections=""
        #             fillColor="#ffff00"
        #             archimateElement="c5369205">
        #        <bounds height="55"
        #  width="120" x="162" y="175"/>
        #      </child>

        attrib = DOE2.attrib

        if u"targetConnections" in attrib:
            attrib[u"targetConnections"] = attrib[u"targetConnections"] + " " + SC_ID
        else:
            attrib[u"targetConnections"] = " " + SC_ID

    #
    # Draw Model
    #
    def drawModel(self, elements):

        #
        # Diagram Model
        #
        DMO = self.createDiagramModel()

        for AE_ID, bnds in elements:
            #
            # DiagramObjects
            #
            self.createDiagramObject(DMO, AE_ID, bnds)

    def outputXMLtoFile(self, filename=u"DiagramModeling.archimate"):
        self.al.outputXMLtoFile(filename)

        ArchiLib.stopTimer(self.start_time)

    def outputXMLtoLog(self):
        self.al.outputXMLtoLog()

        ArchiLib.stopTimer(self.start_time)
    def outputXMLtoFile(self, filename=u"DiagramModeling.archimate"):
        self.al.outputXMLtoFile(filename)

        ArchiLib.stopTimer(self.start_time)
def queryGraph(gdb):

    nj = Neo4JLib(gdb, fileCSVExport)

    start_time = ArchiLib.startTimer()

    # nj.Neo4JCounts()

    #
    # Useful Cypher Queries
    #
    # UpdateQuery = "match (n0 {typeName:'BusinessObject', name:'Contract'}) set n0.PageRank = 1 return n"
    # demoQuery1 = "MATCH (n0:Stakeholder)-- (r0)-- (n1:WorkPackage)--(r1)--(n2:BusinessObject) RETURN n0, r0, n1, r1, n2"
    # demoQuery2 = "MATCH (n0:WorkPackage)--(r0)--(n1:ApplicationComponent)--(r1)--(n2:ApplicationService)--(r2)--(n3:BusinessProcess) where n1.aname = 'Contract Management' RETURN n0, r0, n1, r1, n2, r2, n3"

    # delNodes = "MATCH (n { name: 'Node' })-[r]-() DELETE n, r"

    ql = list()

    if True:
        qs1 = u"MATCH (n:ApplicationFunction)-[r1]-(m:ApplicationComponent)-[r2]-(o:DataObject) "
        qs2 = u"where n.parentPath =~ \"/DVC V3.10/Application/AS400/[ A-Za-z0-9/]+\" "
        qs3 = u"return distinct m.aname, m.typeName, m.parentPath, n.aname, n.typeName, n.parentPath, "
        qs4 = u"o.aname, o.typeName, o.parentPath  order by m.typeName"
        qs = qs1 + qs2 + qs3 + qs4


    elif False:
        qs = u"MATCH (a:ApplicationComponent)-[r*1..2]-(b:ApplicationComponent)-[r1*1..2]-(c:BusinessObject)-[r2*1..2]-(d:Requirement) RETURN distinct a.aname as Application, b.aname, b.typeName, c.aname, c.typeName, d.aname"
        qs1 = u"MATCH (a:BusinessObject)-[r0]-(c:Requirement), (b:BusinessObject)-[r1]-(d:DataObject), (f:DataObject)-[]-(g:ApplicationComponent) where a = b and d=f RETURN a.aname as BusinessObject, c.aname as Requirement, d.aname as DataObject, g.aname as Application"
        qs2 = u"MATCH (n:BusinessObject)-[r]-(m) where m.typeName = \"BusinessObject\" or m.typeName = \"DataObject\" or m.typeName = \"Requirement\" RETURN n.aname, n.typeName, m.aname, m.typeName"

    elif False:
        qs1 =u"MATCH (n:BusinessObject)-[r*1..2]->(m:DataObject) where left(m.parentPath, 46) = \"/DVC V34/Application/Data Objects/AS400 Tables\" RETURN n.aname, n.typeName, m.aname, m.typeName"
        qs = qs1
        
    # These first queries are used for CMS to ECM - Hopefully, they will open some doors
    elif False:

        qs1 = u"MATCH (n:ApplicationComponent {aname : \"GoPublish Websites\"})-[r1]-(m)-[r2]-(o) return n.aname, n.parentPath, m.aname, m.parentPath, o.aname, o.parentPath"
        qs2 = u"MATCH (n:ApplicationComponent {aname : \"Hippo Websites\"})-[r1]->(m) return n.aname, n.parentPath, m.aname, m.parentPath"
        qs3 = u"MATCH (n:ApplicationComponent {aname : \"DLP Websites\"})-[r1]->(m) return n.aname, n.parentPath, m.aname, m.parentPath"
        qs4 = u"MATCH (n:ApplicationComponent {aname : \"OneSource Websites\"})-[r1]->(m) return n.aname, n.parentPath, m.aname, m.parentPath"

        qs = qs4

    elif False:
        qs1 = u"MATCH (n:DataObject)-[r*1..2]->(m:DataObject) where left(n.parentPath, 42) = \"/CMS INTO ECM V5/Application/Content Types\" RETURN n.aname, n.parentPath, m.aname, m.parentPath"
        qs =qs1

    elif False:
        qs0 = u"MATCH (n:ArchimateDiagramModel)-[r]->(m:DiagramObject)-[r1]->(o:ApplicationComponent)-[r2*1..2]->(p:ApplicationComponent) where left(n.parentPath, 46) = \"/CMS INTO ECM V5/Views/3. Application/Websites\" RETURN n.aname, n.parentPath, m.parentPath, o.aname, p.aname"
        qs1 = u"MATCH (n:ArchimateDiagramModel)-[r]->(m:DiagramObject)-[r1]->(o:ApplicationComponent)-[r2*1..3]->(p:DataObject) where left(n.parentPath, 46) = \"/CMS INTO ECM V5/Views/3. Application/Websites\" RETURN n.aname, o.aname, p.aname"
        qs2 = u"MATCH (n:ArchimateDiagramModel)-[r]->(m:DiagramObject)-[r1]->(o:ApplicationComponent)-[r2*1..3]->(p:ApplicationComponent)-[r3*0..3]->(q:DataObject) where left(n.parentPath, 46) = \"/CMS INTO ECM V5/Views/3. Application/Websites\" RETURN n.aname, o.aname, p.aname, q.aname"
        qs3 = u"MATCH (n:ArchimateDiagramModel)-[r]->(m:DiagramObject)-[r1]->(o:ApplicationComponent)-[r2*0..1]->(p:ApplicationComponent) where left(n.parentPath, 46) = \"/CMS INTO ECM V5/Views/3. Application/Websites\" RETURN n.aname, m.typeName, o.aname, p.aname"
        qs = qs3

    elif False:
        qs = u"match (n:BusinessObject)-[r]->(m:Requirement) return n.aname, count(m) order by count(m) desc"

    elif False:
        qs = u"MATCH (a)-[r]->(b) WHERE labels(a) <> [] AND labels(b) <> [] RETURN DISTINCT head(labels(a)) AS This, type(r) as To, head(labels(b)) AS That"

    elif False:
        qs = u"MATCH (m:ApplicationComponent) - [r] -> (n:ApplicationFunction) RETURN distinct(n.aname) as Function, n.parentPath, r.typeName as Type, m.aname as Component, m.parentPath order by n.aname"

    elif False:
        # Determine order of service development based on the dependancy analysis done on Business Processes
        # qs = u"match (l:ApplicationService)--(r0:Relation)-- (n:BusinessProcess)--(r1:Relation)--(m:WorkPackage) return m,l,n order by m.aname"
        # Try with Application Component as well
        qs = u"match (i:DataObject)--(r0:Relation) -- (j:ApplicationComponent)--(r1:Relation)--(l:ApplicationService)--(r2:Relation)-- (n:BusinessProcess)--(r3:Relation)--(m:WorkPackage) return m,n,l,j,i order by m.aname"

    elif False:
        # Determine the business process ordering by the magnitude of the reqiurements
        qs = u"match (i:Requirement)--(r1:Relation)--(j:BusinessObject)--(r2:Relation)--(k:BusinessProcess)--(r3:Relation)--(l:WorkPackage) return l,k,j,count(i) order by l.aname"

    elif False:
        # Determine a Business Scenario's associciation to Business Processes
        # qs = u"match (n0:BusinessEvent) --> (r0:TriggeringRelationship) --> (n1:BusinessProcess) --> (r1:TriggeringRelationship) --> (n2:BusinessEvent) return n0, r0, n1, r1,  n2"
        qs = u"match (n0:BusinessEvent) --> (r0:Relation)--> (n1:BusinessProcess) -[*1..10]-> (r1:FlowRelationship) --> (n2:BusinessProcess) return n0, n1, n2 order by n0.aname"

    elif False:
        qs = u"MATCH (n0:BusinessObject) --> (r0:Relation) --> (n1:BusinessProcess) "
        qs = qs + u"where (toint(substring(n1.aname, 0, 1)) is null ) "
        qs = qs + u"return n0.aname, n1.aname order by n0.aname desc"

    elif False:
        qs = u"match (n:BusinessProcess) <-- (r0:Relation) <-- (m:ApplicationService) "
        qs = qs + u"with n, m, count(r) as cr "
        qs = qs + u" where cr > 0 "
        qs = qs + u" return n.aname, m.aname, cr"

    elif False:
        qs = u"MATCH (n:Requirement) <-- (r0:Relation) <-- (n0:BusinessObject) --> (r1:Relation) -->  (n1:BusinessProcess) "
        qs = qs + u"where (toint(substring(n1.aname, 0, 1)) is null ) "
        qs = qs + u"return count(n), n0.aname, n0.Degree, n0.PageRank, n1.aname, n1.Degree, n1.PageRank order by n0.aname desc"

    elif False:
        ql.append(u"ApplicationFunction")
        ql.append(u"ApplicationComponent")
        ql.append(u"ApplicationService")

        qs = nj.Traversal(ql, directed=True)

    elif False:
        ql.append(u"ApplicationFunction")
        ql.append(u"ApplicationComponent")
        ql.append(u"ApplicationService")
        ql.append(u"BusinessProcess")
        ql.append(u"BusinessObject")

        qs = nj.Traversal(ql, directed=True)

    elif False:
        ql.append(u"WorkPackage")
        ql.append(u"BusinessProcess")
        ql.append(u"ApplicationService")
        ql.append(u"ApplicationComponent")
        ql.append(u"ApplicationFunction")

        qs = nj.Traversal(ql, directed=False)

    elif False:
        qs1 = u"MATCH (n0:BusinessEvent)-- (r0)-- (n1:BusinessProcess) -- (r1) -- (n2:BusinessObject)  RETURN n0, r0, n1, r1, n2"
        qs2 = u"MATCH (n0:BusinessProcess)--(r0)--(n1:ApplicationService)--(r1)--(n2:ApplicationComponent)--(r2)--(n3:DataObject) RETURN n0, r0, n1, r1, n2, r2, n3"
        qs3 = u"MATCH (n0:WorkPackage)--(r0)--(n1:BusinessProcess) RETURN n0, r0, n1"
        qs4 = u"MATCH (n0:ApplicationService)--(r0)--(n2:ApplicationComponent)--(r2)--(n3:DataObject) RETURN n1,r1,n2, r2, n3"
        qs5 = u"MATCH (n0:BusinessObject)--(r0)--(n1:DataObject) RETURN n0, r0, n1"
        qs6 = u"MATCH (n0:BusinessProcess)--(r0)--(n1: BusinessObject)--(r1)--(n2:DataObject)--(r2)--(n3: ApplicationComponent) RETURN n0, r0, n1, r1, n2, r2, n3"
        qs7 = u"MATCH (n:Requirement)<--() <-- (n0:BusinessObject) --> () --> (n1:BusinessProcess) <-- () <-- (n2:ApplicationService)-->()-->(n3:ApplicationComponent)-->()-->(n4:ApplicationFunction) Return n0, count(n), n1, n2, n3, n4 order by count(n) desc, n0.aname"
        qs = qs7

    elif False:
        qs = u"MATCH    (n:Requirement)           <--() "
        qs = qs + u"<-- (n0:BusinessObject)      --> ()"
        qs = qs + u"--> (n1:BusinessProcess)     <-- ()"
        qs = qs + u"<-- (n2:ApplicationService)   -->()"
        qs = qs + u"--> (n3:ApplicationComponent) -->()"
        qs = qs + u"--> (n4:ApplicationFunction) "
        qs = qs + u"Return n0, count(n), n1, n2, n3, n4 "
        qs = qs + u"order by count(n) desc, n0.aname"

    elif False:
        qs = u"MATCH    (n0:BusinessObject)      --> ()"
        qs = qs + u"--> (n1:BusinessProcess)     <-- ()"
        qs = qs + u"<-- (n2:ApplicationService)   -->()"
        qs = qs + u"--> (n3:ApplicationComponent) -->()"
        qs = qs + u"--> (n4:ApplicationFunction) "
        qs = qs + u"Return n0, n1, n2, n3, n4 "
        qs = qs + u"order by n0.aname desc"

    elif False:
        # qs = u"MATCH (n0:BusinessObject)--(r0)--(n1:Requirement) RETURN n0, r0, n1"
        qs = u"MATCH (n0:BusinessObject)--(r0)--(n1:Requirement) RETURN n0, count(n1) ORDER BY count(n1) DESC"
        # qs = u"MATCH (n0:BusinessObject)--(r0:AssociationRelationship)--(n1:Requirement)  RETURN n0, n0.PageRank, n0.RequirementCount, n0.Degree, n0.count, count(n1) ORDER BY count(n1) DESC"
        # qs = u"MATCH (n0:BusinessObject) RETURN n0, n0.PageRank, n0.RequirementCount, n0.Degree, n0.count"
        # qs = u"MATCH (n0:DataObject) RETURN n0, n0.PageRank, n0.RequirementCount, n0.Degree, n0.count"

    else:
        qs = u"match (n0:WorkPackage) --(r0)--(n1:BusinessProcess)--(r1)--(n2:ApplicationService) where n0.aname='Batch %d'  return n0, r0, n1,r1, n2" % (1)

    logger.info(u"QS: %s" % qs)
    lq, qd = nj.cypherQuery(qs)

    nj.queryExport(lq)

    ArchiLib.stopTimer(start_time)
def cleanArchimateRelationships(fileArchimate):

    al = ArchiLib(fileArchimate)

    al.logTypeCounts()

    n = 0
    countInvalid = 0

    for x in al.tree.getroot().iter():
        n += 1

        try:

            if ARCHI_TYPE in x.attrib and x.attrib[ARCHI_TYPE] in relations.values():
                sid = x.get(u"source")
                srcElm = al.findElementByID(sid)[0]

                tid = x.get(u"target")
                tgtElm = al.findElementByID(tid)[0]

                if srcElm is None or tgtElm is None:
                    logger.warn(u"Invalid Relationship : %s[%s]" % (x.get(u"id"), x.get(ARCHI_TYPE)))
                else:
                    logger.debug(u"Valid Relationship   : %s[%s]" % (x.get(u"id"), x.get(ARCHI_TYPE)))

            # <child xsi:type="archimate:DiagramObject" id="2be1001e" textAlignment="2" archimateElement="eedbdc28">
                # <bounds x="692" y="624" width="120" height="55"/>
                # <sourceConnection xsi:type="archimate:Connection" id="c90d2077" source="2be1001e" target="aff3d6b3" relationship="56057f65"/>
                # <sourceConnection xsi:type="archimate:Connection" id="d5cac998" source="2be1001e" target="dfa5c47b" relationship="99bc54ab"/>
                # <sourceConnection xsi:type="archimate:Connection" id="3174a55b" source="2be1001e" target="0308d4c3" relationship="67e21821"/>
            # </child>
            elif ARCHI_TYPE in x.attrib and x.get(ARCHI_TYPE) == DIAGRAM_OBJECT:
                ae = x.get(u"archimateElement")
                aeDO = al.findDiagramObject(ae)[0].attrib
                aeid = aeDO[u"archimateElement"]
                aeElm = al.findElementByID(aeid)[0]

                logger.debug(u"%s[%s] " % (aeElm.get(u"name"), aeElm.get(ARCHI_TYPE)))

            elif ARCHI_TYPE in x.attrib and x.tag == u"sourceConnection":

                src = x.get(u"source")
                srcDO = al.findDiagramObject(src)[0].attrib
                sid = srcDO[u"archimateElement"]
                srcElm = al.findElementByID(sid)[0]

                trc = x.get(u"target")
                tgtDO = al.findDiagramObject(trc)[0].attrib
                tid = tgtDO[u"archimateElement"]
                tgtElm = al.findElementByID(tid)[0]

                rrc = x.get(u"relationship")
                relElm = al.findElementByID(rrc)[0]
                rid = relElm.get(ARCHI_TYPE)[10:]

                logger.debug(u"  S - %s -> [%s] -> %s" % ((srcElm.get(u"name"), rid, tgtElm.get(u"name"))))

            else:
                if u"name" in x.attrib and x.attrib.has_key(ARCHI_TYPE):
                    logger.info(u"Skipping - %s[%s] - %s" % (x.get(ARCHI_TYPE)[10:], x.get(u"id"), x.get(u"name")[:20]))
                else:
                    logger.debug(u"Skipping - %s[%s]" % (x.tag, x.get(u"id")))
        except:
            countInvalid += 1
            logger.error(u"Error - %s[%s]" % (x.tag, x.get(u"id")))

    logger.info(u"Validated %d Elements" % n)

    al.logTypeCounts()