OpenGraph

class bhopengraph.OpenGraph.OpenGraph(source_kind=None)[source]

Bases: object

OpenGraph class for managing a graph structure compatible with BloodHound OpenGraph.

Follows BloodHound OpenGraph schema requirements and best practices.

Sources:

Parameters:

source_kind (str)

__init__(source_kind=None)[source]

Initialize an OpenGraph.

Parameters:

source_kind (-) – Optional source kind for all nodes in the graph

add_edge(edge)[source]

Add an edge to the graph if it doesn’t already exist and if the start and end nodes exist.

Only endpoints resolved by node id are checked against the local node set; name- and property-matched endpoints are resolved by BloodHound at ingestion time and cannot be validated here.

Parameters:

edge (-) – Edge to add

Returns:

True if edge was added, False if an id-matched endpoint node doesn’t exist

Return type:

  • bool

add_edges(edges)[source]

Add a list of edges to the graph.

Returns:

True if all edges were added successfully, False if any failed

Return type:

  • bool

Parameters:

edges (List[Edge])

add_edge_without_validation(edge)[source]

Add an edge to the graph. If an edge with the same key already exists, it will be overwritten.

Parameters:

edge (-) – Edge to add

Returns:

True if edge was added, False if edge is invalid

Return type:

  • bool

add_edges_without_validation(edges)[source]

Add a list of edges to the graph without validation.

Parameters:

edges (-) – List of edges to add

Returns:

True if edges were added successfully

Return type:

  • bool

get_edges_by_kind(kind)[source]

Get all edges of a specific kind.

Parameters:

kind (-) – Kind/type to filter by

Returns:

List of edges with the specified kind

Return type:

  • List[Edge]

get_edges_from_node(node_id)[source]

Get all edges starting from a specific node.

Parameters:

node_id (-) – ID of the source node

Returns:

List of edges starting from the specified node

Return type:

  • List[Edge]

get_edges_to_node(node_id)[source]

Get all edges ending at a specific node.

Parameters:

node_id (-) – ID of the destination node

Returns:

List of edges ending at the specified node

Return type:

  • List[Edge]

get_isolated_edges()[source]

Get all edges that have no start or end node. These are edges that are not connected to any other nodes in the graph.

Returns:

List of edges with no start or end node

Return type:

  • List[Edge]

get_isolated_edges_count()[source]

Get the total number of Isolated edges in the graph. These are edges that are not connected to any other nodes in the graph.

Returns:

Number of Isolated edges

Return type:

  • int

get_edge_count()[source]

Get the total number of edges in the graph.

Returns:

Number of edges

Return type:

  • int

add_node(node)[source]

Add a node to the graph.

Parameters:

node (-) – Node to add

Returns:

True if node was added, False if node with same ID already exists

Return type:

  • bool

add_nodes(nodes)[source]

Add a list of nodes to the graph.

Parameters:

nodes (List[Node])

Return type:

bool

add_node_without_validation(node)[source]

Add a node to the graph without validation.

Parameters:

node (-) – Node to add

Returns:

True if node was added, False if node is invalid

Return type:

  • bool

add_nodes_without_validation(nodes)[source]

Add a list of nodes to the graph without validation.

Parameters:

nodes (-) – List of nodes to add

Returns:

True if nodes were added successfully

Return type:

  • bool

get_node_by_id(id)[source]

Get a node by ID.

Parameters:

id (-) – ID of the node to retrieve

Returns:

The node if found, None otherwise

Return type:

  • Node

get_nodes_by_kind(kind)[source]

Get all nodes of a specific kind.

Parameters:

kind (-) – Kind/type to filter by

Returns:

List of nodes with the specified kind

Return type:

  • List[Node]

get_node_count()[source]

Get the total number of nodes in the graph.

Returns:

Number of nodes

Return type:

  • int

get_isolated_nodes()[source]
Get all nodes that have no edges.

These are nodes that are not connected to any other nodes in the graph.

Returns:

List of nodes with no edges

Return type:

  • List[Node]

get_isolated_nodes_count()[source]

Get the total number of Isolated nodes in the graph. These are nodes that are not connected to any other nodes in the graph.

Returns:

Number of Isolated nodes

Return type:

  • int

remove_node_by_id(id)[source]

Remove a node and all its associated edges from the graph.

Parameters:

id (-) – ID of the node to remove

Returns:

True if node was removed, False if node doesn’t exist

Return type:

  • bool

find_paths(start_id, end_id, max_depth=10)[source]

Find all paths between two nodes using BFS.

Parameters:
  • start_id (-) – Starting node ID

  • end_id (-) – Target node ID

  • max_depth (-) – Maximum path length to search

Returns:

List of paths, where each path is a list of node IDs

Return type:

  • List[List[str]]

get_connected_components()[source]

Find all connected components in the graph.

Returns:

List of connected component sets

Return type:

  • List[Set[str]]

validate_graph()[source]

Validate the graph for common issues including node and edge validation.

Validates: - All nodes using their individual validate() methods - All edges using their individual validate() methods - Graph structure issues (isolated nodes/edges)

Returns:

(is_valid, list_of_errors)

Return type:

  • tuple[bool, list[str]]

export_json(include_metadata=True, indent=None)[source]

Export the graph to JSON format compatible with BloodHound OpenGraph.

Parameters:
  • include_metadata (-) – Whether to include metadata in the export

  • indent (None | int)

Returns:

JSON string representation of the graph

Return type:

  • str

export_to_file(filename, include_metadata=True, indent=None)[source]

Export the graph to a JSON file.

Parameters:
  • filename (-) – Name of the file to write

  • include_metadata (-) – Whether to include metadata in the export

  • indent (None | int)

Returns:

True if export was successful, False otherwise

Return type:

  • bool

export_to_dict()[source]

Export the graph to a dictionary.

Return type:

Dict

import_from_json(json_data)[source]

Load graph data from a JSON string.

Parameters:

json_data (str)

Return type:

bool

import_from_file(filename)[source]

Load graph data from a JSON file.

Parameters:

filename (-) – Name of the file to read

Returns:

True if load was successful, False otherwise

Return type:

  • bool

import_from_dict(data)[source]

Load graph data from a dictionary (typically from JSON).

Parameters:

data (-) – Dictionary containing graph data

Returns:

True if load was successful, False otherwise

Return type:

  • bool

clear()[source]

Clear all nodes and edges from the graph.

Return type:

None

__len__()[source]

Return the total number of nodes and edges.

Returns:

Total number of nodes and edges

Return type:

  • int