external_graph_libs
Convert (to and) from rdflib graphs to other well known graph libraries.
Currently the following libraries are supported:
- networkx: MultiDiGraph, DiGraph, Graph
- graph_tool: Graph
Doctests in this file are all skipped, as we can’t run them conditionally if
networkx or graph_tool are available and they would err otherwise.
see ../../test/test_extras_external_graph_libs.py for conditional tests
Functions:
-
rdflib_to_graphtool–Converts the given graph into a graph_tool.Graph().
-
rdflib_to_networkx_digraph–Converts the given graph into a networkx.DiGraph.
-
rdflib_to_networkx_graph–Converts the given graph into a networkx.Graph.
-
rdflib_to_networkx_multidigraph–Converts the given graph into a networkx.MultiDiGraph.
Attributes:
-
logger–
rdflib_to_graphtool
rdflib_to_graphtool(graph: Graph, v_prop_names: List[str] = ['term'], e_prop_names: List[str] = ['term'], transform_s=lambda s, p, o: {'term': s}, transform_p=lambda s, p, o: {'term': p}, transform_o=lambda s, p, o: {'term': o})
Converts the given graph into a graph_tool.Graph().
The subjects and objects are the later vertices of the Graph. The predicates become edges.
Parameters:
-
(graphGraph) –a rdflib.Graph.
-
(v_prop_namesList[str], default:['term']) –a list of names for the vertex properties. The default is set to [‘term’] (see transform_s, transform_o below).
-
(e_prop_namesList[str], default:['term']) –a list of names for the edge properties.
-
–transform_scallable with s, p, o input. Should return a dictionary containing a value for each name in v_prop_names. By default is set to {‘term’: s} which in combination with v_prop_names = [‘term’] adds s as ‘term’ property to the generated vertex for s.
-
–transform_psimilar to transform_s, but wrt. e_prop_names. By default returns {‘term’: p} which adds p as a property to the generated edge between the vertex for s and the vertex for o.
-
–transform_osimilar to transform_s.
Returns: graph_tool.Graph()
Example
>>> from rdflib import Graph, URIRef, Literal
>>> g = Graph()
>>> a, b, l = URIRef('a'), URIRef('b'), Literal('l')
>>> p, q = URIRef('p'), URIRef('q')
>>> edges = [(a, p, b), (a, q, b), (b, p, a), (b, p, l)]
>>> for t in edges:
... g.add(t)
...
>>> mdg = rdflib_to_graphtool(g)
>>> len(list(mdg.edges()))
4
>>> from graph_tool import util as gt_util
>>> vpterm = mdg.vertex_properties['term']
>>> va = gt_util.find_vertex(mdg, vpterm, a)[0]
>>> vb = gt_util.find_vertex(mdg, vpterm, b)[0]
>>> vl = gt_util.find_vertex(mdg, vpterm, l)[0]
>>> (va, vb) in [(e.source(), e.target()) for e in list(mdg.edges())]
True
>>> epterm = mdg.edge_properties['term']
>>> len(list(gt_util.find_edge(mdg, epterm, p))) == 3
True
>>> len(list(gt_util.find_edge(mdg, epterm, q))) == 1
True
>>> mdg = rdflib_to_graphtool(
... g,
... e_prop_names=[str('name')],
... transform_p=lambda s, p, o: {str('name'): unicode(p)})
>>> epterm = mdg.edge_properties['name']
>>> len(list(gt_util.find_edge(mdg, epterm, unicode(p)))) == 3
True
>>> len(list(gt_util.find_edge(mdg, epterm, unicode(q)))) == 1
True
Source code in rdflib/extras/external_graph_libs.py
261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 | |
rdflib_to_networkx_digraph
rdflib_to_networkx_digraph(graph: Graph, calc_weights: bool = True, edge_attrs=lambda s, p, o: {'triples': [(s, p, o)]}, **kwds)
Converts the given graph into a networkx.DiGraph.
As an rdflib.Graph() can contain multiple edges between nodes, by default adds the a ‘triples’ attribute to the single DiGraph edge with a list of all triples between s and o. Also by default calculates the edge weight as the length of triples.
Parameters:
-
(graphGraph) –a rdflib.Graph.
-
(calc_weightsbool, default:True) –If true calculate multi-graph edge-count as edge ‘weight’
-
–edge_attrsCallable to construct later edge_attributes. It receives 3 variables (s, p, o) and should construct a dictionary that is passed to networkx’s add_edge(s, o, **attrs) function.
By default this will include setting the ‘triples’ attribute here, which is treated specially by us to be merged. Other attributes of multi-edges will only contain the attributes of the first edge. If you don’t want the ‘triples’ attribute for tracking, set this to
lambda s, p, o: {}.
Returns: networkx.DiGraph
Example
>>> from rdflib import Graph, URIRef, Literal
>>> g = Graph()
>>> a, b, l = URIRef('a'), URIRef('b'), Literal('l')
>>> p, q = URIRef('p'), URIRef('q')
>>> edges = [(a, p, b), (a, q, b), (b, p, a), (b, p, l)]
>>> for t in edges:
... g.add(t)
...
>>> dg = rdflib_to_networkx_digraph(g)
>>> dg[a][b]['weight']
2
>>> sorted(dg[a][b]['triples']) == [(a, p, b), (a, q, b)]
True
>>> len(dg.edges())
3
>>> dg.size()
3
>>> dg.size(weight='weight')
4.0
>>> dg = rdflib_to_networkx_graph(g, False, edge_attrs=lambda s,p,o:{})
>>> 'weight' in dg[a][b]
False
>>> 'triples' in dg[a][b]
False
Source code in rdflib/extras/external_graph_libs.py
rdflib_to_networkx_graph
rdflib_to_networkx_graph(graph: Graph, calc_weights: bool = True, edge_attrs=lambda s, p, o: {'triples': [(s, p, o)]}, **kwds)
Converts the given graph into a networkx.Graph.
As an rdflib.Graph() can contain multiple directed edges between nodes, by
default adds the a ‘triples’ attribute to the single DiGraph edge with a list of triples between s and o in graph.
Also by default calculates the edge weight as the len(triples).
Parameters:
-
(graphGraph) –a rdflib.Graph.
-
(calc_weightsbool, default:True) –If true calculate multi-graph edge-count as edge ‘weight’
-
–edge_attrsCallable to construct later edge_attributes. It receives 3 variables (s, p, o) and should construct a dictionary that is passed to networkx’s add_edge(s, o, **attrs) function.
By default this will include setting the ‘triples’ attribute here, which is treated specially by us to be merged. Other attributes of multi-edges will only contain the attributes of the first edge. If you don’t want the ‘triples’ attribute for tracking, set this to
lambda s, p, o: {}.
Returns:
-
–
networkx.Graph
Example
>>> from rdflib import Graph, URIRef, Literal
>>> g = Graph()
>>> a, b, l = URIRef('a'), URIRef('b'), Literal('l')
>>> p, q = URIRef('p'), URIRef('q')
>>> edges = [(a, p, b), (a, q, b), (b, p, a), (b, p, l)]
>>> for t in edges:
... g.add(t)
...
>>> ug = rdflib_to_networkx_graph(g)
>>> ug[a][b]['weight']
3
>>> sorted(ug[a][b]['triples']) == [(a, p, b), (a, q, b), (b, p, a)]
True
>>> len(ug.edges())
2
>>> ug.size()
2
>>> ug.size(weight='weight')
4.0
>>> ug = rdflib_to_networkx_graph(g, False, edge_attrs=lambda s,p,o:{})
>>> 'weight' in ug[a][b]
False
>>> 'triples' in ug[a][b]
False
Source code in rdflib/extras/external_graph_libs.py
rdflib_to_networkx_multidigraph
rdflib_to_networkx_multidigraph(graph: Graph, edge_attrs=lambda s, p, o: {'key': p}, **kwds)
Converts the given graph into a networkx.MultiDiGraph.
The subjects and objects are the later nodes of the MultiDiGraph. The predicates are used as edge keys (to identify multi-edges).
Parameters:
-
(graphGraph) –a rdflib.Graph.
-
–edge_attrsCallable to construct later edge_attributes. It receives 3 variables (s, p, o) and should construct a dictionary that is passed to networkx’s add_edge(s, o, **attrs) function.
By default this will include setting the MultiDiGraph key=p here. If you don’t want to be able to re-identify the edge later on, you can set this to
lambda s, p, o: {}. In this case MultiDiGraph’s default (increasing ints) will be used.
Returns:
-
–
networkx.MultiDiGraph
Example
>>> from rdflib import Graph, URIRef, Literal
>>> g = Graph()
>>> a, b, l = URIRef('a'), URIRef('b'), Literal('l')
>>> p, q = URIRef('p'), URIRef('q')
>>> edges = [(a, p, b), (a, q, b), (b, p, a), (b, p, l)]
>>> for t in edges:
... g.add(t)
...
>>> mdg = rdflib_to_networkx_multidigraph(g)
>>> len(mdg.edges())
4
>>> mdg.has_edge(a, b)
True
>>> mdg.has_edge(a, b, key=p)
True
>>> mdg.has_edge(a, b, key=q)
True
>>> mdg = rdflib_to_networkx_multidigraph(g, edge_attrs=lambda s,p,o: {})
>>> mdg.has_edge(a, b, key=0)
True
>>> mdg.has_edge(a, b, key=1)
True