Mercurial > repos > guerler > springsuite
comparison planemo/lib/python3.7/site-packages/rdflib/tools/rdfs2dot.py @ 1:56ad4e20f292 draft
"planemo upload commit 6eee67778febed82ddd413c3ca40b3183a3898f1"
| author | guerler |
|---|---|
| date | Fri, 31 Jul 2020 00:32:28 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 0:d30785e31577 | 1:56ad4e20f292 |
|---|---|
| 1 """ | |
| 2 A commandline tool for drawing RDFS Class diagrams in Graphviz DOT | |
| 3 format | |
| 4 | |
| 5 You can draw the graph of an RDFS file directly: | |
| 6 | |
| 7 .. code-block: bash | |
| 8 | |
| 9 rdf2dot my_rdfs_file.rdf | dot -Tpng | display | |
| 10 """ | |
| 11 | |
| 12 import rdflib.extras.cmdlineutils | |
| 13 | |
| 14 import sys | |
| 15 import itertools | |
| 16 import collections | |
| 17 | |
| 18 | |
| 19 from rdflib import XSD, RDF, RDFS | |
| 20 | |
| 21 | |
| 22 XSDTERMS = [XSD[x] for x in ( | |
| 23 "anyURI", "base64Binary", "boolean", "byte", "date", "dateTime", "decimal", | |
| 24 "double", "duration", "float", "gDay", "gMonth", "gMonthDay", "gYear", | |
| 25 "gYearMonth", "hexBinary", "ID", "IDREF", "IDREFS", "int", "integer", | |
| 26 "language", "long", "Name", "NCName", "negativeInteger", "NMTOKEN", | |
| 27 "NMTOKENS", "nonNegativeInteger", "nonPositiveInteger", "normalizedString", | |
| 28 "positiveInteger", "QName", "short", "string", "time", "token", | |
| 29 "unsignedByte", "unsignedInt", "unsignedLong", "unsignedShort")] | |
| 30 | |
| 31 EDGECOLOR = "blue" | |
| 32 NODECOLOR = "black" | |
| 33 ISACOLOR = "black" | |
| 34 | |
| 35 | |
| 36 def rdfs2dot(g, stream, opts={}): | |
| 37 """ | |
| 38 Convert the RDFS schema in a graph | |
| 39 writes the dot output to the stream | |
| 40 """ | |
| 41 | |
| 42 fields = collections.defaultdict(set) | |
| 43 nodes = {} | |
| 44 | |
| 45 def node(x): | |
| 46 | |
| 47 if x not in nodes: | |
| 48 nodes[x] = "node%d" % len(nodes) | |
| 49 return nodes[x] | |
| 50 | |
| 51 def label(x, g): | |
| 52 | |
| 53 l = g.value(x, RDFS.label) | |
| 54 if l is None: | |
| 55 try: | |
| 56 l = g.namespace_manager.compute_qname(x)[2] | |
| 57 except: | |
| 58 pass # bnodes and some weird URIs cannot be split | |
| 59 return l | |
| 60 | |
| 61 stream.write("digraph { \n node [ fontname=\"DejaVu Sans\" ] ; \n") | |
| 62 | |
| 63 for x in g.subjects(RDF.type, RDFS.Class): | |
| 64 n = node(x) | |
| 65 | |
| 66 for x, y in g.subject_objects(RDFS.subClassOf): | |
| 67 x = node(x) | |
| 68 y = node(y) | |
| 69 stream.write("\t%s -> %s [ color=%s ] ;\n" % (y, x, ISACOLOR)) | |
| 70 | |
| 71 for x in g.subjects(RDF.type, RDF.Property): | |
| 72 for a, b in itertools.product( | |
| 73 g.objects(x, RDFS.domain), g.objects(x, RDFS.range)): | |
| 74 if b in XSDTERMS or b == RDFS.Literal: | |
| 75 l = label(b, g) | |
| 76 if b == RDFS.Literal: | |
| 77 l = "literal" | |
| 78 fields[node(a)].add((label(x, g), l)) | |
| 79 else: | |
| 80 # if a in nodes and b in nodes: | |
| 81 stream.write( | |
| 82 "\t%s -> %s [ color=%s, label=\"%s\" ];\n" % ( | |
| 83 node(a), node(b), EDGECOLOR, label(x, g))) | |
| 84 | |
| 85 for u, n in list(nodes.items()): | |
| 86 stream.write("# %s %s\n" % (u, n)) | |
| 87 f = ["<tr><td align='left'>%s</td><td>%s</td></tr>" % | |
| 88 x for x in sorted(fields[n])] | |
| 89 opstr = "%s [ shape=none, color=%s label=< <table color='#666666'" + \ | |
| 90 " cellborder=\"0\" cellspacing='0' border=\"1\"><tr>" + \ | |
| 91 "<td colspan=\"2\" bgcolor='grey'><B>%s</B></td>" + \ | |
| 92 "</tr>%s</table> > ] \n" | |
| 93 stream.write(opstr % (n, NODECOLOR, label(u, g), "".join(f))) | |
| 94 | |
| 95 stream.write("}\n") | |
| 96 | |
| 97 | |
| 98 def _help(): | |
| 99 sys.stderr.write(""" | |
| 100 rdfs2dot.py [-f <format>] files... | |
| 101 Read RDF files given on STDOUT, writes a graph of the RDFS schema in | |
| 102 DOT language to stdout | |
| 103 -f specifies parser to use, if not given, | |
| 104 | |
| 105 """) | |
| 106 | |
| 107 | |
| 108 def main(): | |
| 109 rdflib.extras.cmdlineutils.main(rdfs2dot, _help) | |
| 110 | |
| 111 if __name__ == '__main__': | |
| 112 main() |
