Skip to content

Commit e07b8d4

Browse files
Add remove_node method to SQLBackend (#58)
* Add remove_node method to SQLBackend * NetworKit extra requires NumPy < 2.0 * Modify has_node to return a bool vs int * Update method parameters to conform to existing naming standards
1 parent 71286f3 commit e07b8d4

File tree

3 files changed

+39
-6
lines changed

3 files changed

+39
-6
lines changed

grand/backends/_sqlbackend.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
from typing import Hashable, Generator, Optional, Iterable
1+
from typing import Hashable, Generator
22
import time
33

44
import pandas as pd
55
import sqlalchemy
6-
from sqlalchemy.pool import NullPool
7-
from sqlalchemy.sql import select
8-
from sqlalchemy import and_, or_, func, Index
6+
from sqlalchemy.sql import delete, select
7+
from sqlalchemy import or_, func, Index
98

109
from .backend import Backend
1110

@@ -192,6 +191,29 @@ def _upsert_node(self, node_name: Hashable, metadata: dict) -> Hashable:
192191
parameters={self._primary_key: node_name, "_metadata": metadata},
193192
)
194193

194+
def remove_node(self, u: Hashable) -> None:
195+
"""
196+
Removes nodes and related edges for name.
197+
198+
Args:
199+
u (Hashable): id of the node
200+
"""
201+
202+
# Remove nodes
203+
statement = delete(self._node_table).where(
204+
self._node_table.c[self._primary_key] == str(u)
205+
)
206+
self._connection.execute(statement)
207+
208+
# Remove edges for node
209+
statement = delete(self._edge_table).where(
210+
or_(
211+
self._edge_table.c[self._edge_source_key] == str(u),
212+
self._edge_table.c[self._edge_target_key] == str(u)
213+
)
214+
)
215+
self._connection.execute(statement)
216+
195217
def all_nodes_as_iterable(self, include_metadata: bool = False) -> Generator:
196218
"""
197219
Get a generator of all of the nodes in this graph.
@@ -233,7 +255,7 @@ def has_node(self, u: Hashable) -> bool:
233255
self._node_table.c[self._primary_key] == str(u)
234256
)
235257
).fetchall()
236-
)
258+
) > 0
237259

238260
def add_edge(self, u: Hashable, v: Hashable, metadata: dict):
239261
"""

grand/backends/test_backends.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,17 @@ def test_sqlite_persistence(self):
151151
nodes = list(backend.all_nodes_as_iterable())
152152
# assert
153153
assert node0 in nodes
154+
155+
# test remove_node
156+
backend = SQLBackend(db_url=url, directed=True)
157+
node1, node2 = backend.add_node("A", {}), backend.add_node("B", {})
158+
backend.add_edge(node1, node2, {})
159+
assert backend.has_node(node1)
160+
assert backend.has_edge(node1, node2)
161+
backend.remove_node(node1)
162+
assert not backend.has_node(node1)
163+
assert not backend.has_edge(node1, node2)
164+
154165
# cleanup
155166
os.remove(dbpath)
156167

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
"sql": ["SQLAlchemy>=1.3"],
2020
"dynamodb": ["boto3"],
2121
"igraph": ["igraph"],
22-
"networkit": ["cmake", "cython", "networkit"],
22+
"networkit": ["cmake", "cython", "networkit", "numpy<2.0.0"],
2323
},
2424
classifiers=[
2525
"Programming Language :: Python :: 3",

0 commit comments

Comments
 (0)