Graph Transformation#

In GraphScope, nx.Graph or nx.DiGraph can be created from GraphScope graph object. We implement a copy-on-write transformation strategy for creating from GraphScope graph. That is, when init a nx.Graph or nx.DiGraph object with GraphScope graph object, we do not convert arrow property graph to dynamic property graph immediately, but just host the arrow property graph in the nx.Graph or nx.DiGraph object. And the graph can report graph info and run algorithms as expected. When the graph comes to modification operation, the arrow property graph would convert to dynamic property graph, that is the copy-on-write transformation strategy. Here is an example to show the copy-on-write transformation.

Note: nx.Graph and nx.DiGraph not support to be created from a GraphScope multigraph (which contains parallel edge). If input graph is multigraph, it would raise a NetworkXError.

>>> # first create a labeled graphscope graph
>>> graph = graphscope.g()
>>> graph.add_vertices("v_0.csv", label="v0")
>>> graph.add_vertices("v_1.csv", label="v1")
>>> graph.add_edge("e.csv", label="e", src_label="v0", dst_label="v1")

>>> # then we init a nx.Graph with graph, here we set v0 as default vertex label
>>> G = nx.Graph(graph, default_label="v0")  # G actually hosts a arrow property graph

>>> # we can report info of G or run algorithm without converting to dynamic property graph
>>> print(G.nodes)
[0, ("v1", 1)]
>>> nx.builtin.pagerank(G)

>>> # when comes to the modification, hosted arrow property graph convert to dynamic property graph
>>> G.add_node(1)
>>> print(G.nodes)
[0, 1, ("v1", 1)]
graphscope.nx.Graph.__init__(self, incoming_graph_data=None, default_label=None, **attr)#

Initialize a graph with graph, edges, name, or graph attributes

Parameters:
  • incoming_graph_data (input graph (optional, default: None)) – Data to initialize graph. If None (default) an empty graph is created. The data can be an edge list, any NetworkX graph object or any GraphScope graph object. If the corresponding optional Python packages are installed the data can also be a 2D NumPy array, a SciPy sparse matrix

  • default_label (default node label (optional, default: "_")) – if incoming_graph_data is a GraphScope graph object, default label means the nodes of the label can be accessed by id directly, other label nodes need to use (label, id) to access.

  • attr (keyword arguments, optional (default= no attributes)) – Attributes to add to graph as key=value pairs.

See also

convert

Examples

>>> G = nx.Graph()  # or DiGraph
>>> G = nx.Graph(name='my graph')
>>> e = [(1, 2), (2, 3), (3, 4)]  # list of edges
>>> G = nx.Graph(e)

Arbitrary graph attribute pairs (key=value) may be assigned

>>> G = nx.Graph(e, day="Friday")
>>> G.graph
{'day': 'Friday'}

Created from a GraphScope graph object

>>> g = graphscope.g(directed=False)  # if transform to DiGraph, directed=True
>>> g.add_vertices("person.csv", label="person").add_vertices("comment.csv", label="comment").add_edges(...)
>>> G = nx.Graph(g, default_label="person") # or DiGraph
graphscope.nx.Graph._convert_arrow_to_dynamic(self)#

Try to convert the hosted graph from arrow_property to dynamic_property.

Notes

the method is implicit called by modification and graph view methods.