comparison env/lib/python3.9/site-packages/prov/graph.py @ 0:4f3585e2f14b draft default tip

"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author shellac
date Mon, 22 Mar 2021 18:12:50 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4f3585e2f14b
1 from __future__ import (absolute_import, division, print_function,
2 unicode_literals)
3
4 import networkx as nx
5 from prov.model import (
6 ProvDocument, ProvRecord, ProvElement, ProvEntity, ProvActivity, ProvAgent,
7 ProvRelation, PROV_ATTR_ENTITY, PROV_ATTR_ACTIVITY, PROV_ATTR_AGENT,
8 PROV_ATTR_TRIGGER, PROV_ATTR_GENERATED_ENTITY, PROV_ATTR_USED_ENTITY,
9 PROV_ATTR_DELEGATE, PROV_ATTR_RESPONSIBLE, PROV_ATTR_SPECIFIC_ENTITY,
10 PROV_ATTR_GENERAL_ENTITY, PROV_ATTR_ALTERNATE1, PROV_ATTR_ALTERNATE2,
11 PROV_ATTR_COLLECTION, PROV_ATTR_INFORMED, PROV_ATTR_INFORMANT
12 )
13
14 __author__ = 'Trung Dong Huynh'
15 __email__ = 'trungdong@donggiang.com'
16
17
18 INFERRED_ELEMENT_CLASS = {
19 PROV_ATTR_ENTITY: ProvEntity,
20 PROV_ATTR_ACTIVITY: ProvActivity,
21 PROV_ATTR_AGENT: ProvAgent,
22 PROV_ATTR_TRIGGER: ProvEntity,
23 PROV_ATTR_GENERATED_ENTITY: ProvEntity,
24 PROV_ATTR_USED_ENTITY: ProvEntity,
25 PROV_ATTR_DELEGATE: ProvAgent,
26 PROV_ATTR_RESPONSIBLE: ProvAgent,
27 PROV_ATTR_SPECIFIC_ENTITY: ProvEntity,
28 PROV_ATTR_GENERAL_ENTITY: ProvEntity,
29 PROV_ATTR_ALTERNATE1: ProvEntity,
30 PROV_ATTR_ALTERNATE2: ProvEntity,
31 PROV_ATTR_COLLECTION: ProvEntity,
32 PROV_ATTR_INFORMED: ProvActivity,
33 PROV_ATTR_INFORMANT: ProvActivity
34 }
35
36
37 def prov_to_graph(prov_document):
38 """
39 Convert a :class:`~prov.model.ProvDocument` to a `MultiDiGraph
40 <https://networkx.readthedocs.io/en/stable/reference/classes.multigraph.html>`_
41 instance of the `NetworkX <https://networkx.github.io/>`_ library.
42
43 :param prov_document: The :class:`~prov.model.ProvDocument` instance to convert.
44 """
45 g = nx.MultiDiGraph()
46 unified = prov_document.unified()
47 node_map = dict()
48 for element in unified.get_records(ProvElement):
49 g.add_node(element)
50 node_map[element.identifier] = element
51
52 for relation in unified.get_records(ProvRelation):
53 # taking the first two elements of a relation
54 attr_pair_1, attr_pair_2 = relation.formal_attributes[:2]
55 # only need the QualifiedName (i.e. the value of the attribute)
56 qn1, qn2 = attr_pair_1[1], attr_pair_2[1]
57 if qn1 and qn2: # only proceed if both ends of the relation exist
58 try:
59 if qn1 not in node_map:
60 node_map[qn1] = \
61 INFERRED_ELEMENT_CLASS[attr_pair_1[0]](None, qn1)
62 if qn2 not in node_map:
63 node_map[qn2] = \
64 INFERRED_ELEMENT_CLASS[attr_pair_2[0]](None, qn2)
65 except KeyError:
66 # Unsupported attribute; cannot infer the type of the element
67 continue # skipping this relation
68 g.add_edge(node_map[qn1], node_map[qn2], relation=relation)
69 return g
70
71
72 def graph_to_prov(g):
73 """
74 Convert a `MultiDiGraph
75 <https://networkx.readthedocs.io/en/stable/reference/classes.multigraph.html>`_
76 that was previously produced by :func:`prov_to_graph` back to a
77 :class:`~prov.model.ProvDocument`.
78
79 :param g: The graph instance to convert.
80 """
81 prov_doc = ProvDocument()
82 for n in g.nodes_iter():
83 if isinstance(n, ProvRecord) and n.bundle is not None:
84 prov_doc.add_record(n)
85 for _, _, edge_data in g.edges_iter(data=True):
86 try:
87 relation = edge_data['relation']
88 if isinstance(relation, ProvRecord):
89 prov_doc.add_record(relation)
90 except KeyError:
91 pass
92
93 return prov_doc