{ "cells": [ { "cell_type": "markdown", "id": "ddde566c30b011f5", "metadata": {}, "source": [ "# Karate Club dataset\n", "\n", "This notebook shows the classic Zachary Karate Club network loaded into both\n", "`NetworkXGraph` and `Neo4jGraph` using the shared loader in `drm.exemples`.\n", "\n", "Dataset notes:\n", "- 34 members\n", "- classic community-detection benchmark\n", "- `club` attribute is used to build club nodes" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import importlib.util\n", "\n", "# Comprovació de presència del paquet\n", "package_to_check = 'drm'\n", "spec = importlib.util.find_spec(package_to_check)\n", "\n", "if spec is None:\n", " print(f'⚠️ {package_to_check} no està instal·lat. Iniciant instal·lació...')\n", " %pip install -q --upgrade drm-tools\n", " print(\"✅ Instal·lació completada. L'estat del kernel PODRIA requerir un reinici.\")\n", "else:\n", " print(f'✅ {package_to_check} ja està present al sistema. Saltant instal·lació.')\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "772e8aa7040da578", "metadata": {}, "outputs": [], "source": [ "import os\n", "\n", "from drm import Neo4jGraph, NetworkXGraph\n", "from drm.exemples import load_karate_club\n", "\n", "\n", "def neo4j_config(default_target=\"DEV\"):\n", " target = os.environ.get(\"NEO4J_TARGET\", default_target).upper()\n", " prefix = f\"NEO4J_{target}_\"\n", " return {\n", " \"target\": target,\n", " \"url\": os.environ.get(f\"{prefix}URL\", os.environ.get(\"NEO4J_URL\", \"bolt://localhost:7687\")),\n", " \"user\": os.environ.get(f\"{prefix}USER\", os.environ.get(\"NEO4J_USER\", \"neo4j\")),\n", " \"password\": os.environ.get(f\"{prefix}PASSWORD\", os.environ.get(\"NEO4J_PASSWORD\", \"secret\")),\n", " \"database\": os.environ.get(f\"{prefix}DATABASE\", os.environ.get(\"NEO4J_DATABASE\", \"neo4j\")),\n", " }" ] }, { "cell_type": "markdown", "id": "7731e45f88102429", "metadata": {}, "source": [ "## NetworkXGraph" ] }, { "cell_type": "code", "execution_count": 8, "id": "d1c28d2a0ad20e68", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "NetworkX stats: {'members': 34, 'clubs': 2, 'interacts': 78, 'member_of': 34}\n", "NetworkX nodes: 36\n", "NetworkX edges: 112\n" ] } ], "source": [ "nx_graph = NetworkXGraph()\n", "nx_stats = load_karate_club(nx_graph)\n", "print(\"NetworkX stats:\", nx_stats)\n", "print(\"NetworkX nodes:\", len(nx_graph.get_nodes()))\n", "print(\"NetworkX edges:\", len(nx_graph.get_edges()))\n", "nx_graph.close()" ] }, { "cell_type": "markdown", "id": "8d5ed68714b8bc2", "metadata": {}, "source": [ "## Neo4jGraph" ] }, { "cell_type": "code", "execution_count": 9, "id": "d1faaade9f02aba", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using Neo4j target: DEV\n" ] }, { "ename": "AuthError", "evalue": "{neo4j_code: Neo.ClientError.Security.Unauthorized} {message: The client is unauthorized due to authentication failure.} {gql_status: 50N42} {gql_status_description: error: general processing exception - unexpected error. The client is unauthorized due to authentication failure.}", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mAuthError\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[9]\u001b[39m\u001b[32m, line 3\u001b[39m\n\u001b[32m 1\u001b[39m cfg = neo4j_config()\n\u001b[32m 2\u001b[39m print(\u001b[33m\"Using Neo4j target:\"\u001b[39m, cfg[\u001b[33m\"target\"\u001b[39m])\n\u001b[32m----> \u001b[39m\u001b[32m3\u001b[39m neo4j_graph = Neo4jGraph(\n\u001b[32m 4\u001b[39m url=cfg[\u001b[33m\"url\"\u001b[39m],\n\u001b[32m 5\u001b[39m user=cfg[\u001b[33m\"user\"\u001b[39m],\n\u001b[32m 6\u001b[39m password=cfg[\u001b[33m\"password\"\u001b[39m],\n", "\u001b[36mFile \u001b[39m\u001b[32m~/Desenvolupament/drm-tools/drm/neo4j_graph.py:55\u001b[39m, in \u001b[36mNeo4jGraph.__init__\u001b[39m\u001b[34m(self, url, user, password, database)\u001b[39m\n\u001b[32m 51\u001b[39m \u001b[38;5;28mself\u001b[39m._session = \u001b[38;5;28mself\u001b[39m._driver.session(database=database)\n\u001b[32m 52\u001b[39m \u001b[38;5;66;03m# self._version = list(list(self._session._pool.connections.values())[0])[\u001b[39;00m\n\u001b[32m 53\u001b[39m \u001b[38;5;66;03m# 0\u001b[39;00m\n\u001b[32m 54\u001b[39m \u001b[38;5;66;03m# ].PROTOCOL_VERSION[0]\u001b[39;00m\n\u001b[32m---> \u001b[39m\u001b[32m55\u001b[39m \u001b[38;5;28mself\u001b[39m._version = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_driver\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mget_server_info\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m.protocol_version[\u001b[32m0\u001b[39m]\n\u001b[32m 56\u001b[39m \u001b[38;5;66;03m# FK index: neo4j_id → set of (other_id, rel_type, direction)\u001b[39;00m\n\u001b[32m 57\u001b[39m \u001b[38;5;66;03m# direction: \"out\" = edge starts here, \"in\" = edge ends here\u001b[39;00m\n\u001b[32m 58\u001b[39m \u001b[38;5;28mself\u001b[39m._fk_index: Dict[\u001b[38;5;28mint\u001b[39m, Set[Tuple[\u001b[38;5;28mint\u001b[39m, \u001b[38;5;28mstr\u001b[39m, \u001b[38;5;28mstr\u001b[39m]]] = {}\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/driver.py:1142\u001b[39m, in \u001b[36mDriver.get_server_info\u001b[39m\u001b[34m(self, **config)\u001b[39m\n\u001b[32m 1137\u001b[39m preview_warn(\n\u001b[32m 1138\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mPassing key-word arguments to get_server_info() is a \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 1139\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mpreview feature.\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 1140\u001b[39m )\n\u001b[32m 1141\u001b[39m session_config = \u001b[38;5;28mself\u001b[39m._read_session_config(config)\n\u001b[32m-> \u001b[39m\u001b[32m1142\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_get_server_info\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43msession_config\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/driver.py:1293\u001b[39m, in \u001b[36mDriver._get_server_info\u001b[39m\u001b[34m(self, session_config)\u001b[39m\n\u001b[32m 1291\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_get_server_info\u001b[39m(\u001b[38;5;28mself\u001b[39m, session_config) -> ServerInfo:\n\u001b[32m 1292\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m._session(session_config) \u001b[38;5;28;01mas\u001b[39;00m session:\n\u001b[32m-> \u001b[39m\u001b[32m1293\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43msession\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_get_server_info\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/work/session.py:175\u001b[39m, in \u001b[36mSession._get_server_info\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 173\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34m_get_server_info\u001b[39m(\u001b[38;5;28mself\u001b[39m):\n\u001b[32m 174\u001b[39m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m._connection\n\u001b[32m--> \u001b[39m\u001b[32m175\u001b[39m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_connect\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 176\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mREAD_ACCESS\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mliveness_check_timeout\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43m0\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43munprepared\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43;01mTrue\u001b[39;49;00m\n\u001b[32m 177\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 178\u001b[39m server_info = \u001b[38;5;28mself\u001b[39m._connection.server_info\n\u001b[32m 179\u001b[39m \u001b[38;5;28mself\u001b[39m._disconnect()\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/work/session.py:128\u001b[39m, in \u001b[36mSession._connect\u001b[39m\u001b[34m(self, access_mode, **acquire_kwargs)\u001b[39m\n\u001b[32m 126\u001b[39m access_mode = \u001b[38;5;28mself\u001b[39m._config.default_access_mode\n\u001b[32m 127\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m128\u001b[39m \u001b[30;43msuper\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_connect\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 129\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43maccess_mode\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mauth\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_config\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mauth\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43macquire_kwargs\u001b[39;49m\n\u001b[32m 130\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 131\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m asyncio.CancelledError:\n\u001b[32m 132\u001b[39m \u001b[38;5;28mself\u001b[39m._handle_cancellation(message=\u001b[33m\"\u001b[39m\u001b[33m_connect\u001b[39m\u001b[33m\"\u001b[39m)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/work/workspace.py:181\u001b[39m, in \u001b[36mWorkspace._connect\u001b[39m\u001b[34m(self, access_mode, auth, **acquire_kwargs)\u001b[39m\n\u001b[32m 171\u001b[39m acquire_kwargs_ = {\n\u001b[32m 172\u001b[39m \u001b[33m\"\u001b[39m\u001b[33maccess_mode\u001b[39m\u001b[33m\"\u001b[39m: access_mode,\n\u001b[32m 173\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mtimeout\u001b[39m\u001b[33m\"\u001b[39m: acquisition_deadline,\n\u001b[32m (...)\u001b[39m\u001b[32m 178\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mdatabase_callback\u001b[39m\u001b[33m\"\u001b[39m: \u001b[38;5;28mself\u001b[39m._make_db_resolution_callback(),\n\u001b[32m 179\u001b[39m }\n\u001b[32m 180\u001b[39m acquire_kwargs_.update(acquire_kwargs)\n\u001b[32m--> \u001b[39m\u001b[32m181\u001b[39m \u001b[38;5;28mself\u001b[39m._connection = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_pool\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43macquire\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43m*\u001b[39;49m\u001b[30;43macquire_kwargs_\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 182\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[32m 183\u001b[39m target_db.guessed\n\u001b[32m 184\u001b[39m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mself\u001b[39m._pinned_database\n\u001b[32m (...)\u001b[39m\u001b[32m 188\u001b[39m \u001b[38;5;66;03m# support SSR.\u001b[39;00m\n\u001b[32m 189\u001b[39m \u001b[38;5;66;03m# => we need to fall back to explicit home database resolution\u001b[39;00m\n\u001b[32m 190\u001b[39m log.debug(\n\u001b[32m 191\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m[#0000] _: detected ssr support race; \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 192\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mfalling back to explicit home database resolution\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 193\u001b[39m )\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/io/_pool.py:678\u001b[39m, in \u001b[36mBoltPool.acquire\u001b[39m\u001b[34m(self, access_mode, timeout, database, bookmarks, auth, liveness_check_timeout, unprepared, database_callback)\u001b[39m\n\u001b[32m 671\u001b[39m deadline = acquisition_timeout_to_deadline(timeout)\n\u001b[32m 672\u001b[39m log.debug(\n\u001b[32m 673\u001b[39m \u001b[33m\"\u001b[39m\u001b[33m[#0000] _: acquire direct connection, \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 674\u001b[39m \u001b[33m\"\u001b[39m\u001b[33maccess_mode=\u001b[39m\u001b[38;5;132;01m%r\u001b[39;00m\u001b[33m, database=\u001b[39m\u001b[38;5;132;01m%r\u001b[39;00m\u001b[33m\"\u001b[39m,\n\u001b[32m 675\u001b[39m access_mode,\n\u001b[32m 676\u001b[39m database,\n\u001b[32m 677\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m678\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_acquire\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 679\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43maddress\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mauth\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mdeadline\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mliveness_check_timeout\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43munprepared\u001b[39;49m\n\u001b[32m 680\u001b[39m \u001b[30;43m\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/io/_pool.py:418\u001b[39m, in \u001b[36mIOPool._acquire\u001b[39m\u001b[34m(self, address, auth, deadline, liveness_check_timeout, unprepared)\u001b[39m\n\u001b[32m 413\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m ConnectionAcquisitionTimeoutError(\n\u001b[32m 414\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mfailed to obtain a connection from the pool within \u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 415\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mdeadline.original_timeout\u001b[38;5;132;01m!r}\u001b[39;00m\u001b[33ms (timeout)\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m 416\u001b[39m )\n\u001b[32m 417\u001b[39m log.debug(\u001b[33m\"\u001b[39m\u001b[33m[#0000] _: trying to hand out new connection\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m--> \u001b[39m\u001b[32m418\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mconnection_creator\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/io/_pool.py:231\u001b[39m, in \u001b[36mIOPool._acquire_new_later..connection_creator\u001b[39m\u001b[34m()\u001b[39m\n\u001b[32m 229\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m 230\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m231\u001b[39m connection = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mopener\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 232\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43maddress\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mauth\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43;01mor\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mpool_config\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mauth\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mdeadline\u001b[39;49m\n\u001b[32m 233\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 234\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m ServiceUnavailable:\n\u001b[32m 235\u001b[39m \u001b[38;5;28mself\u001b[39m.deactivate(address)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/io/_pool.py:638\u001b[39m, in \u001b[36mBoltPool.open..opener\u001b[39m\u001b[34m(addr, auth_manager, deadline)\u001b[39m\n\u001b[32m 637\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mopener\u001b[39m(addr, auth_manager, deadline):\n\u001b[32m--> \u001b[39m\u001b[32m638\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[30;43mBolt\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mopen\u001b[39;49m\u001b[30;43m(\u001b[39;49m\n\u001b[32m 639\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43maddr\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 640\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mauth_manager\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mauth_manager\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 641\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mdeadline\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mdeadline\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 642\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mrouting_context\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43;01mNone\u001b[39;49;00m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 643\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43mpool_config\u001b[39;49m\u001b[30;43m=\u001b[39;49m\u001b[30;43mpool_config\u001b[39;49m\u001b[30;43m,\u001b[39;49m\n\u001b[32m 644\u001b[39m \u001b[30;43m \u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/io/_bolt.py:426\u001b[39m, in \u001b[36mBolt.open\u001b[39m\u001b[34m(address, auth_manager, deadline, routing_context, pool_config)\u001b[39m\n\u001b[32m 424\u001b[39m connection.socket.set_write_deadline(deadline)\n\u001b[32m 425\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m426\u001b[39m \u001b[30;43mconnection\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mhello\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 427\u001b[39m \u001b[38;5;28;01mfinally\u001b[39;00m:\n\u001b[32m 428\u001b[39m connection.socket.set_read_deadline(\u001b[38;5;28;01mNone\u001b[39;00m)\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/io/_bolt4.py:658\u001b[39m, in \u001b[36mBolt4x3.hello\u001b[39m\u001b[34m(self, dehydration_hooks, hydration_hooks)\u001b[39m\n\u001b[32m 649\u001b[39m \u001b[38;5;28mself\u001b[39m._append(\n\u001b[32m 650\u001b[39m \u001b[33mb\u001b[39m\u001b[33m\"\u001b[39m\u001b[38;5;130;01m\\x01\u001b[39;00m\u001b[33m\"\u001b[39m,\n\u001b[32m 651\u001b[39m (headers,),\n\u001b[32m (...)\u001b[39m\u001b[32m 655\u001b[39m dehydration_hooks=dehydration_hooks,\n\u001b[32m 656\u001b[39m )\n\u001b[32m 657\u001b[39m \u001b[38;5;28mself\u001b[39m.send_all()\n\u001b[32m--> \u001b[39m\u001b[32m658\u001b[39m \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mfetch_all\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/io/_bolt.py:883\u001b[39m, in \u001b[36mBolt.fetch_all\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 881\u001b[39m response = \u001b[38;5;28mself\u001b[39m.responses[\u001b[32m0\u001b[39m]\n\u001b[32m 882\u001b[39m \u001b[38;5;28;01mwhile\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m response.complete:\n\u001b[32m--> \u001b[39m\u001b[32m883\u001b[39m detail_delta, summary_delta = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mfetch_message\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 884\u001b[39m detail_count += detail_delta\n\u001b[32m 885\u001b[39m summary_count += summary_delta\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/io/_bolt.py:868\u001b[39m, in \u001b[36mBolt.fetch_message\u001b[39m\u001b[34m(self)\u001b[39m\n\u001b[32m 864\u001b[39m \u001b[38;5;66;03m# Receive exactly one message\u001b[39;00m\n\u001b[32m 865\u001b[39m tag, fields = \u001b[38;5;28mself\u001b[39m.inbox.pop(\n\u001b[32m 866\u001b[39m hydration_hooks=\u001b[38;5;28mself\u001b[39m.responses[\u001b[32m0\u001b[39m].hydration_hooks\n\u001b[32m 867\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m868\u001b[39m res = \u001b[30;43mself\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43m_process_message\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43mtag\u001b[39;49m\u001b[30;43m,\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43mfields\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 869\u001b[39m \u001b[38;5;28mself\u001b[39m.idle_since = monotonic()\n\u001b[32m 870\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m res\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/io/_bolt4.py:497\u001b[39m, in \u001b[36mBolt4x0._process_message\u001b[39m\u001b[34m(self, tag, fields)\u001b[39m\n\u001b[32m 495\u001b[39m \u001b[38;5;28mself\u001b[39m._server_state_manager.state = BoltStates.FAILED\n\u001b[32m 496\u001b[39m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m497\u001b[39m \u001b[30;43mresponse\u001b[39;49m\u001b[30;43m.\u001b[39;49m\u001b[30;43mon_failure\u001b[39;49m\u001b[30;43m(\u001b[39;49m\u001b[30;43msummary_metadata\u001b[39;49m\u001b[30;43m \u001b[39;49m\u001b[30;43;01mor\u001b[39;49;00m\u001b[30;43m \u001b[39;49m\u001b[30;43m{\u001b[39;49m\u001b[30;43m}\u001b[39;49m\u001b[30;43m)\u001b[39;49m\n\u001b[32m 498\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m (ServiceUnavailable, DatabaseUnavailable):\n\u001b[32m 499\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m.pool:\n", "\u001b[36mFile \u001b[39m\u001b[32m~/opt/anaconda3/envs/drm-env/lib/python3.11/site-packages/neo4j/_sync/io/_common.py:292\u001b[39m, in \u001b[36mInitResponse.on_failure\u001b[39m\u001b[34m(self, metadata)\u001b[39m\n\u001b[32m 287\u001b[39m Util.callback(handler)\n\u001b[32m 288\u001b[39m metadata[\u001b[33m\"\u001b[39m\u001b[33mmessage\u001b[39m\u001b[33m\"\u001b[39m] = metadata.get(\n\u001b[32m 289\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mmessage\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 290\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mConnection initialisation failed due to an unknown error\u001b[39m\u001b[33m\"\u001b[39m,\n\u001b[32m 291\u001b[39m )\n\u001b[32m--> \u001b[39m\u001b[32m292\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;28mself\u001b[39m._hydrate_error(metadata)\n", "\u001b[31mAuthError\u001b[39m: {neo4j_code: Neo.ClientError.Security.Unauthorized} {message: The client is unauthorized due to authentication failure.} {gql_status: 50N42} {gql_status_description: error: general processing exception - unexpected error. The client is unauthorized due to authentication failure.}" ] } ], "source": [ "cfg = neo4j_config()\n", "print(\"Using Neo4j target:\", cfg[\"target\"])\n", "neo4j_graph = Neo4jGraph(\n", " url=cfg[\"url\"],\n", " user=cfg[\"user\"],\n", " password=cfg[\"password\"],\n", " database=cfg[\"database\"],\n", ")\n", "try:\n", " neo4j_stats = load_karate_club(neo4j_graph)\n", " print(\"Neo4j stats:\", neo4j_stats)\n", "finally:\n", " neo4j_graph.close()\n" ] }, { "cell_type": "code", "execution_count": null, "id": "9462bc61-a67e-4333-aa7d-ffad1da10cad", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python (drm-tools)", "language": "python", "name": "drm-env" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.14" } }, "nbformat": 4, "nbformat_minor": 5 }