class_docstr: Class which stores vertex and edge properties that can be used to construct
  Graphs from individual property selections and used later to annotate graph
  algorithm results with corresponding properties.
class_docstr_tok: ["Class","which","stores","vertex","and","edge","properties","that","can","be","used","to","construct","Graphs","from","individual","property","selections","and","used","later","to","annotate","graph","algorithm","results","with","corresponding","properties","."]
code: def __init__(self, num_workers=None):
      # The dataframe containing the properties for each vertex.
      # Each vertex occupies a row, and individual properties are maintained
      # in individual columns. The table contains a column for each property
      # of each vertex. If a vertex does not contain a property, it will have
      # a NaN value in that property column. Each vertex will also have a
      # "type_name" that can be assigned by the caller to describe the type
      # of the vertex for a given application domain. If no type_name is
      # provided, the default type_name is "".
      # Example:
      # vertex | type_name | propA | propB | propC
      # ------------------------------------------
      #      3 | "user"    | 22    | NaN   | 11
      #     88 | "service" | NaN   | 3.14  | 21
      #      9 | ""        | NaN   | NaN   | 2
      self.__vertex_prop_dataframe = None
  
      # The dataframe containing the properties for each edge.
      # The description is identical to the vertex property dataframe, except
      # edges are identified by ordered pairs of vertices (src and dst).
      # Example:
      # src | dst | type_name | propA | propB | propC
      # ---------------------------------------------
      #   3 |  88 | "started" | 22    | NaN   | 11
      #  88 |   9 | "called"  | NaN   | 3.14  | 21
      #   9 |  88 | ""        | NaN   | NaN   | 2
      self.__edge_prop_dataframe = None
  
      # The var:value dictionaries used during evaluation of filter/query
      # expressions for vertices and edges. These dictionaries contain
      # entries for each column name in their respective dataframes which
      # are mapped to instances of PropertyColumn objects.
      #
      # When filter/query expressions are evaluated, PropertyColumn objects
      # are used in place of DataFrame columns in order to support string
      # comparisons when cuDF DataFrames are used. This approach also allows
      # expressions to contain var names that can be used in expressions that
      # are different than those in the actual internal tables, allowing for
      # the tables to contain additional or different column names than what
      # can be used in expressions.
      #
      # Example: "type_name == 'user' & propC > 10"
      #
      # The above would be evaluated and "type_name" and "propC" would be
      # PropertyColumn instances which support specific operators used in
      # queries.
      self.__vertex_prop_eval_dict = {}
      self.__edge_prop_eval_dict = {}
  
      self.__dataframe_type = dask_cudf.DataFrame
      self.__series_type = dask_cudf.Series
  
      # The dtypes for each column in each DataFrame.  This is required since
      # merge operations can often change the dtypes to accommodate NaN
      # values (eg. int64 to float64, since NaN is a float).
      self.__vertex_prop_dtypes = {}
      self.__edge_prop_dtypes = {}
  
      # Lengths of the properties that are vectors
      self.__vertex_vector_property_lengths = {}
      self.__edge_vector_property_lengths = {}
  
      # Add unique edge IDs to the __edge_prop_dataframe by simply
      # incrementing this counter. Remains None if user provides edge IDs.
      self.__last_edge_id = None
  
      # Are edge IDs automatically generated sequentially by PG (True),
      # provided by the user (False), or no edges added yet (None).
      self.__is_edge_id_autogenerated = None
  
      # Cached property values
      self.__num_vertices = None
      self.__vertex_type_value_counts = None
      self.__edge_type_value_counts = None
  
      # number of gpu's to use
      if num_workers is None:
          self.__num_workers = dcg.get_n_workers()
      else:
          self.__num_workers = num_workers
  
imports: import cudf
  import cupy
  import cugraph
  import dask_cudf
  import cugraph.dask
  from cugraph.utilities.utils import import_optional, create_list_series_from_2d_ar
  from typing import Union
label_desc: Use image node_id 1 to create a new EXPERIMENTAL__MGPropertyGraph object  with example: obj = EXPERIMENTAL__MGPropertyGraph(num_workers)