示例#1
0
 def testGraphFromDictIterator(self):
     g = Graph.DictList(iter(self.vertices), iter(self.edges))
     self.checkIfOK(g, "name")
     g = Graph.DictList(iter(self.vertices),
                        iter(self.edges),
                        iterative=True)
     self.checkIfOK(g, "name")
 def testGraphFromDictListAlternativeName(self):
     for vdata in self.vertices:
         vdata["name_alternative"] = vdata["name"]
         del vdata["name"]
     g = Graph.DictList(
         self.vertices, self.edges, vertex_name_attr="name_alternative"
     )
     self.checkIfOK(g, "name_alternative")
     g = Graph.DictList(
         self.vertices, self.edges, vertex_name_attr="name_alternative",
         iterative=True
     )
     self.checkIfOK(g, "name_alternative")
示例#3
0
 def testGraphFromDictListExtraVertexName(self):
     del self.vertices[2:]  # No data for "Cecil" and "David"
     g = Graph.DictList(self.vertices, self.edges)
     self.assertTrue(g.vcount() == 4 and g.ecount() == 5 and not g.is_directed())
     self.assertTrue(g.vs["name"] == ["Alice", "Bob", "Cecil", "David"])
     self.assertTrue(g.vs["age"] == [48, 33, None, None])
     self.assertTrue(g.vs["gender"] == ["F", "M", None, None])
     self.assertTrue(g.es["friendship"] == [4, 5, 5, 2, 1])
     self.assertTrue(g.es["advice"] == [4, 5, 5, 4, 2])
     self.assertTrue(g.get_edgelist() == [(0, 1), (1, 2), (0, 2), (0, 3), (1, 3)])
示例#4
0
 def testGraphFromDictIteratorNoVertices(self):
     g = Graph.DictList(None, iter(self.edges))
     self.checkIfOK(g, "name", check_vertex_attrs=False)
     g = Graph.DictList(None, iter(self.edges), iterative=True)
     self.checkIfOK(g, "name", check_vertex_attrs=False)
示例#5
0
    def createConceptGraph(self):
        def getSubClassEdgeWeight(edge, elist):
            def getPosToTop(elist, n, visited):
                for e in elist:
                    if not e['type'] == RDFS.subClassOf:
                        continue
                    if (e['source'] == n) & (not n in visited):
                        visited.append(n)
                        return getPosToTop(elist, e['target'], visited) + 1
                return 0

            def getPosToBottom(elist, n, visited):
                max = 0
                for e in elist:
                    if not e['type'] == RDFS.subClassOf:
                        continue
                if (e['target'] == n) & (not n in visited):
                    visited.append(n)
                    depth = getPosToBottom(elist, e['source'], visited) + 1
                    if (depth > max):
                        max = depth
                return max

            posToTop = getPosToTop(elist, edge['target'], []) + 1
            posToBottom = getPosToBottom(elist, edge['source'], [])
            height = posToTop + posToBottom
            if (height == 1):
                relPosInHierachie = 0
            else:
                relPosInHierachie = float(posToTop) / float(height)
            abw = relPosInHierachie - baseline
            abwNorm = abw * trange
            res = multi * (math.atan(abwNorm) + math.pi / 2)
            return res

        def filter(subject, classlist):
            if isinstance(subject, BNode): return True
            if (str(subject) in classlist): return True
            for ns in NSBLACKLIST:
                if str(subject).startswith(ns):
                    return True
            return False

        graph = self.spec.graph

        classtypes = [RDFS.Class, OWL.Class]
        classlist = []
        classObj = []
        nlist = []
        elist = []

        #create nodes
        for onetype in classtypes:
            for classSub in graph.subjects(predicate=RDF.type, object=onetype):
                #print("checking: " +str(classSub));
                if not filter(classSub, classlist):
                    uri = str(classSub)
                    classlist.append(uri)
                    classObj.append(classSub)
                    #print("adding node: "+ uri);
                    nlist.append({
                        'node': classSub,
                        'uri': uri,
                        'name': self.gen[uri],
                        'label': str(uri).replace(self.ns, ""),
                        "type": "Class"
                    })
                #else: print("filtered")
        #print classObj
        #if class != null create owl:Thing node
        thing = OWL.Thing
        uri = str(thing)
        classlist.append(uri)
        classObj.append(thing)
        nlist.append({
            'node':
            thing,
            'uri':
            uri,
            'name':
            self.gen[uri],
            'label':
            str(uri).replace("http://www.w3.org/2002/07/owl#", ""),
            "type":
            "ExternalClass"
        })

        #create edges
        for c in classObj:
            if (c == OWL.Thing):
                continue
            found = False

            #build concept hierachy
            for obj in graph.objects(c, RDFS.subClassOf):
                if (obj in classObj):
                    found = True
                    #get source and target id
                    source = self.gen[str(c)]
                    target = self.gen[str(obj)]
                    elist.append({
                        "type": RDFS.subClassOf,
                        'source': source,
                        'target': target,
                        "proptype": "language"
                    })

            #add link to owl:thing if top node
            if not found:
                #print("add subclass link for level1 class " + str(c.uri));
                source = self.gen[str(c)]
                target = self.gen[str(OWL.Thing)]
                elist.append({
                    "type": RDFS.subClassOf,
                    'source': source,
                    'target': target,
                    "proptype": "language"
                })

        #add domain level edges
        for sub, obj in graph.subject_objects(RDFS.domain):
            #test if obj in classlist
            if (obj in classObj):
                prop = sub
                for rObj in graph.objects(prop, RDFS.range):
                    if (rObj in classObj):
                        #add a edge

                        dom = obj
                        range = rObj
                        source = self.gen[str(dom)]
                        target = self.gen[str(range)]
                        #print("Adding  edge from "+ str(dom.uri) + " to " + str(range.uri) + " with Prop: "+str(prop.uri));

                        elist.append({
                            "type": prop,
                            'source': source,
                            'target': target,
                            "proptype": "domain"
                        })

        #add some other language level edges
        for sub, obj in graph.subject_objects(OWL.equivalentClass):
            if (sub in classObj) and (obj in classObj):
                source = self.gen[str(sub)]
                target = self.gen[str(obj)]
                elist.append({
                    "type": OWL.equivalentClass,
                    'source': source,
                    'target': target,
                    "proptype": "language"
                })
        for sub, obj in graph.subject_objects(OWL.disjointWith):
            if (sub in classObj) and (obj in classObj):
                source = self.gen[str(sub)]
                target = self.gen[str(obj)]
                elist.append({
                    "type": OWL.disjointWith,
                    'source': source,
                    'target': target,
                    "proptype": "language"
                })

        #nodes and edges created
        #weighting them

        for edge in elist:
            if (edge['type'] == RDFS.subClassOf):
                weight = getSubClassEdgeWeight(edge, elist)
                edge['weight'] = weight
            elif edge['proptype'] == 'domain':
                weight = (edgeWeights[RDFS.domain] +
                          edgeWeights[RDFS.range]) / 2
                edge['weight'] = weight
            else:
                weight = edgeWeights[edge['type']]
                if weight == None: weight = 1
                edge['weight'] = weight

        #print nlist;
        #print elist;
        g = Graph.DictList(vertices=nlist, edges=elist, directed=True)
        return g, classObj