The file-graph
class provides an abstract implementation for graph operations. It supports graph manipulation, including creating, updating, and deleting vertices, creating arcs and edges, and traversing or querying the graph structure.
To install file-graph from npm, run the following command:
npm install file-graph
Alternatively, you can install it from the GitHub registry.
This makes it more professional and adds the GitHub registry installation syntax.
const graph = FileGraph('../graph.txt');
FileGraph
accepts a path where the graph data will be stored. The graph object returned is an instance of the FileGraphAbstract
class, which provides methods for manipulating the graph. You can refer to the jsDoc documentation documentation for more details.
After initializing the graph at the specified path, a file will be created where each line represents a vertex. It is recommended not to modify the file contents manually.
Example of a vertex record:
{
"id": "33ef29be-adaa-4509-b306-62a32db7310e", // UUID - unique identifier of the vertex
"data": { ... }, // The data associated with the vertex
"links": [] // List of UUIDs of vertices that this vertex is connected to
}
Below is an overview of the methods, their parameters, return values, and examples of how to use them.
Creates a vertex (node) in the graph with the provided data.
- Parameters:
data: T
- An object representing the vertex data.
- Returns:
- A promise that resolves to the created vertex object
{ id, data, links }
.
- A promise that resolves to the created vertex object
const data = { name: 'Alice', age: 30 };
const createdVertex = await graph.createVertex(data);
console.log(createdVertex);
// Output: { id: 'some-unique-id', data: { name: 'Alice', age: 30 }, links: [] }
Creates multiple vertices at once.
- Parameters:
data: T[]
- An array of objects representing the data for each vertex.
- Returns:
- A promise that resolves to an array of created vertex objects.
const data = [{ name: 'Alice' }, { name: 'Bob' }];
const createdVertices = await graph.createVertices(data);
console.log(createdVertices);
// Output: [{ id: 'id1', data: { name: 'Alice' }, links: [] }, { id: 'id2', data: { name: 'Bob' }, links: [] }]
Updates a vertex that matches the given condition. The updater function defines the logic for finding and modifying the vertex.
- Parameters:
updater: IUpdater<T>
- A function that takes a vertex and returns an updated vertex if it matches the condition.
- Returns:
- A promise that resolves to
true
if the update was successful, otherwisefalse
.
- A promise that resolves to
const isUpdated = await graph.updateVertex(
vertex =>
vertex.id === 'some-unique-id' && { data: { name: 'Alice Updated' } },
);
console.log(isUpdated); // true
Deletes a vertex that matches the given condition.
- Parameters:
predicate: IPredicate<T>
- A function that returnstrue
if the vertex should be deleted.
- Returns:
- A promise that resolves to
true
if the deletion was successful, otherwisefalse
.
- A promise that resolves to
const isDeleted = await graph.deleteVertex(
vertex => vertex.id === 'some-unique-id',
);
console.log(isDeleted); // true
Finds a single vertex that matches the given condition.
- Parameters:
predicate: IPredicate<T>
- A function that returnstrue
if the vertex matches the search condition.
- Returns:
- A promise that resolves to the matching vertex object, or
null
if no match is found.
- A promise that resolves to the matching vertex object, or
const foundVertex = await graph.findOne(vertex => vertex.data.name === 'Alice');
console.log(foundVertex);
// Output: { id: 'some-unique-id', data: { name: 'Alice', age: 30 }, links: [] }
Finds all vertices that match the given condition.
- Parameters:
predicate: IPredicate<T>
- A function that returnstrue
for each vertex that matches the search condition.
- Returns:
- A promise that resolves to an array of matching vertex objects.
const foundVertices = await graph.findAll(
vertex => vertex.data.name === 'Alice',
);
console.log(foundVertices);
// Output: [{ id: 'id1', data: { name: 'Alice', age: 30 }, links: [] }, { id: 'id2', data: { name: 'Alice', age: 25 }, links: [] }]
Iterates over each vertex in the graph and applies the provided callback function.
- Parameters:
callbackVertex: ICallbackVertex<T>
- A callback function that is invoked for each vertex. If it returnstrue
, the iteration stops.
- Returns:
- A promise that resolves when the iteration is complete.
await graph.forEachVertex(vertex => {
console.log(vertex);
// Stop iteration if the vertex's name is 'Alice'
return vertex.data.name === 'Alice';
});
Creates edges (links) between the specified vertices.
- Parameters:
ids: IUuidArray
- An array of vertex IDs between which to create edges.
- Returns:
- A promise that resolves to
true
if the edge creation was successful.
- A promise that resolves to
const isEdgeCreated = await graph.createEdge(['id1', 'id2', 'id3']);
console.log(isEdgeCreated); // true
Removes the edges (links) between the specified vertices in the graph.
-
Parameters
ids: IUuidArray
- An array of vertex IDs. The edges between the vertices specified by these IDs will be removed.
-
Returns
- A promise that resolves to
true
if the edge removal was successful.
- A promise that resolves to
const isEdgeRemoved = await graph.removeEdge(['id1', 'id2', 'id3']);
console.log(isEdgeRemoved); // true
Creates an arc (directed edge) between two vertices.
- Parameters:
sourceVertexId: uuidType
- The ID of the source vertex.targetVertexId: uuidType
- The ID of the target vertex.
- Returns:
- A promise that resolves to
true
if the arc creation was successful.
- A promise that resolves to
const isArcCreated = await graph.createArc('id1', 'id2');
console.log(isArcCreated); // true
Creates arcs (directed edges) between multiple vertices in the specified order.
- Parameters:
ids: IUuidArray
- An array of vertex IDs.
- Returns:
- A promise that resolves to
true
if the arcs creation was successful.
- A promise that resolves to
const isArcsCreated = await graph.createArcs(['id1', 'id2', 'id3']);
console.log(isArcsCreated); // true
Removes an arc (edge) between two vertices.
- Parameters:
sourceVertexId: uuidType
- The ID of the source vertex.targetVertexId: uuidType
- The ID of the target vertex.
- Returns:
- A promise that resolves to
true
if the arc was successfully removed.
- A promise that resolves to
const isArcRemoved = await graph.removeArc('id1', 'id2');
console.log(isArcRemoved); // true
Checks if an arc exists between two vertices.
- Parameters:
sourceVertexId: uuidType
- The ID of the source vertex.targetVertexId: uuidType
- The ID of the target vertex.
- Returns:
- A promise that resolves to
true
if the arc exists, otherwisefalse
.
- A promise that resolves to
const hasArc = await graph.hasArc('id1', 'id2');
console.log(hasArc); // true or false
Retrieves vertices up to a specified depth level from a starting vertex.
- Parameters:
vertexId: uuidType
- The ID of the starting vertex.maxLevel?: number
- (Optional) The depth level to limit the search.
- Returns:
- A promise that resolves to an array of vertices up to the specified level.
const graphTree = await graph.findUpToLevel('id1', 2);
console.log(graphTree);
/* Output: [
{ id: 'id1',data:{...},links:[...],level: 0 },
{ id: 'id2',data:{...},links:[...], level: 1 },
{ id: 'id3', data:{...},links:[...],level: 2 }
]; */
searchVerticesFrom<T extends object>(vertexId: uuidType, predicate: IPredicate<T>): Promise<IVertex<T>[]>
Performs a search starting from the given vertex and returns vertices that match the predicate.
- Parameters:
vertexId: uuidType
- The ID of the starting vertex.predicate: IPredicate<T>
- A function used to evaluate each vertex. Only vertices that satisfy the predicate will be returned.
- Returns:
- A promise that resolves to an array of matching vertices.
const matchingVertices = await graph.searchVerticesFrom(
'id1',
vertex => vertex.data.age > 25,
);
console.log(matchingVertices);
// Output: [{ id: 'id2', data: { name: 'Alice', age: 30 }, links: [] }]
Checks if a path exists between two vertices using Depth-First Search (DFS).
- Parameters:
sourceVertexId: uuidType
- The ID of the source vertex.targetVertexId: uuidType
- The ID of the target vertex.
- Returns:
- A promise that resolves to
true
if a path exists between the vertices, otherwisefalse
.
- A promise that resolves to
const pathExists = await graph.hasPath('id1', 'id3');
console.log(pathExists); // true or false
This abstract class provides the blueprint for interacting with a graph structure, supporting both simple and complex operations for managing vertices and their relationships. Concrete implementations should define the behavior for storing and retrieving graph data.