<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fh="http://purl.org/syndication/history/1.0"><channel><title>nx-neptune | Blog</title><description>Graph analytics for your data lake — powered by NetworkX and Amazon Neptune Analytics.</description><link>https://awslabs.github.io/</link><language>en</language><fh:complete/><atom:link rel="self" href="https://awslabs.github.io/nx-neptune/blog/rss.xml"/><item><title>Graph Analytics Over Your Data Lake: A Feature Walkthrough of nx-neptune</title><link>https://awslabs.github.io/nx-neptune/blog/graph-analytics-over-data-lakes/</link><guid isPermaLink="true">https://awslabs.github.io/nx-neptune/blog/graph-analytics-over-data-lakes/</guid><description>A hands-on tour of nx-neptune — the open-source library that projects your S3 tables into a graph, runs algorithms on Neptune Analytics on demand, and writes the results back to your data lake.</description><pubDate>Sun, 30 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This post is a walkthrough of what nx-neptune does, feature by feature: defining a graph over your tables, provisioning compute on demand, running algorithms, visualizing the result, and exporting it back to the lake.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;what-the-library-gives-you&quot;&gt;What the library gives you&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/awslabs/nx-neptune&quot;&gt;nx-neptune&lt;/a&gt; is an open-source Python library that packages &lt;strong&gt;a pipeline that projects your tabular data into a graph on demand, runs the analytics, and writes the enriched result back to Iceberg&lt;/strong&gt;. Your tables stay put as the source of truth; the library handles the extract, transform, and load steps for you and spins the graph engine up only while you need it, so there’s no permanent graph database to operate. Concretely, you can:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Define a graph over existing tables.&lt;/strong&gt; Map tables to &lt;em&gt;nodes&lt;/em&gt; and the events or associations that link them to &lt;em&gt;edges&lt;/em&gt; using plain SQL — the library turns those definitions into the extract-and-transform step for you.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provision a graph engine on demand.&lt;/strong&gt; The library creates a graph view of your data and moves it into a graph engine behind the scenes, within an ephemeral session you can tear down when you’re finished.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Run graph queries and algorithms.&lt;/strong&gt; Execute &lt;a href=&quot;https://opencypher.org/&quot;&gt;openCypher&lt;/a&gt; queries for traversals, or use the &lt;a href=&quot;https://networkx.org/&quot;&gt;NetworkX&lt;/a&gt;-compatible interface to run community detection, centrality, pathfinding, and more.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Write results back to the lake.&lt;/strong&gt; Export the enriched, algorithm-annotated graph back to your tables so the rest of your data ecosystem can use it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Graphs shine wherever relationships matter — community structure and information flow in social networks, route optimization and bottleneck analysis in supply chains, vulnerability and threat mapping in security, and pattern discovery across financial services, knowledge management, and advertising. The walkthrough below uses a generic transaction-style dataset, but the same steps apply to any tabular data you can express as nodes and edges.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;why-amazon-neptune-analytics&quot;&gt;Why Amazon Neptune Analytics?&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Rather than reimplement graph algorithms itself, nx-neptune runs the analysis on &lt;a href=&quot;https://docs.aws.amazon.com/neptune-analytics/latest/userguide/what-is-neptune-analytics.html&quot;&gt;Amazon Neptune Analytics&lt;/a&gt; — a high-performance graph engine that runs built-in algorithms, vector search, and in-memory processing over graph data, scaling to datasets with tens of billions of relationships and returning results in seconds. The library provisions a Neptune Analytics instance on demand, loads your projected graph into it, runs the algorithm there, and tears the instance down when you’re done. Because Neptune Analytics reads and writes graphs through Amazon services, the walkthrough connects to AWS resources such as Amazon S3, Amazon Athena, and Amazon Neptune throughout.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;how-it-fits-together&quot;&gt;How it fits together&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The library orchestrates a small set of AWS services to project your data-lake tables into a graph and run analytics on that projection:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://awslabs.github.io/nx-neptune/_astro/unlocking_graph_hld.D4z9f9N9_Zl91A8.webp&quot; alt=&quot;High-level architecture: Neptune Notebooks orchestrate Amazon S3 Tables, projected through Amazon Athena and graph-imported into Amazon Neptune Analytics, with results returned to the data lake.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2470&quot; height=&quot;582&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Amazon S3 Tables&lt;/strong&gt; provide cost-effective storage for your data lake in Apache Iceberg format. S3 Tables offer the benefits of a data lake — scalability, durability, and low cost — while supporting atomicity, consistency, isolation, and durability (ACID) transactions and schema evolution. Your data stays in S3, where storage costs are minimal.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Amazon Athena&lt;/strong&gt; acts as the query layer, letting you project tabular data into graph structures (nodes and edges) using standard SQL. Athena’s serverless model means you only pay for the queries you run, with no infrastructure to manage.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Amazon Neptune Analytics&lt;/strong&gt; provides the graph compute engine. You provision an instance on demand to run graph algorithms like community detection, centrality measures, and pathfinding, then suspend or delete it when the analysis is complete.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Amazon Neptune Notebooks&lt;/strong&gt; give you a place to run the pipeline. For this walkthrough we deploy a Jupyter notebook connected to these services, with direct access to your Neptune Analytics graph and the Graph Explorer visualization tool.&lt;/p&gt;
&lt;p&gt;The notebook workflow is straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Store your data in S3 Tables (Iceberg format).&lt;/li&gt;
&lt;li&gt;Use Athena SQL queries to define graph views (answer “what is a node?” and “what is an edge?”).&lt;/li&gt;
&lt;li&gt;Load the view data into Neptune Analytics as nodes and edges.&lt;/li&gt;
&lt;li&gt;Run graph algorithms using openCypher queries (or the &lt;a href=&quot;https://networkx.org/&quot;&gt;NetworkX&lt;/a&gt; Python library).&lt;/li&gt;
&lt;li&gt;Export the annotated graph results back to S3 Tables.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Key benefits:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cost-effective storage&lt;/strong&gt; — data lives in S3 at pennies per GB per month.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On-demand compute&lt;/strong&gt; — provision a powerful Neptune Analytics instance only when you need it, and only over the data you need.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Open-source tooling&lt;/strong&gt; — &lt;code dir=&quot;auto&quot;&gt;nx-neptune&lt;/code&gt; provides an interface for managing graph sessions, running openCypher queries, and a &lt;a href=&quot;https://networkx.org/&quot;&gt;NetworkX-compatible&lt;/a&gt; interface for graph analysis.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;walkthrough&quot;&gt;Walkthrough&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The complete implementation ships as an executable notebook, deployed by a CloudFormation template. It contains the following sections, which this walkthrough follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Setup/Configuration&lt;/strong&gt;: Define the environment variables that point at your resources.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Data Setup&lt;/strong&gt;: Land your source data and prepare the data lake.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Create a New / Get Existing Neptune Analytics&lt;/strong&gt;: Start a session with Neptune.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Import Data from S3&lt;/strong&gt;: Move your table data into the graph.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Execute an Algorithm&lt;/strong&gt;: Analyze the graph — here, community detection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export back to S3 Tables&lt;/strong&gt;: Write the annotated results into a new Iceberg table.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;prepare-resources-and-role&quot;&gt;Prepare resources and role&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;To follow along, you need the following &lt;strong&gt;AWS services&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Amazon S3 (for data logging &amp;#x26; storing intermediate state)&lt;/li&gt;
&lt;li&gt;Amazon S3 Tables (for Iceberg tables)&lt;/li&gt;
&lt;li&gt;Amazon Athena (for SQL queries)&lt;/li&gt;
&lt;li&gt;Amazon Neptune Analytics (for graph compute)&lt;/li&gt;
&lt;li&gt;AWS Key Management Service (AWS KMS — for encryption of data at rest)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;clone-the-repository-and-deploy-the-cloudformation-stack&quot;&gt;Clone the repository and deploy the CloudFormation stack&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Clone the nx-neptune repository to a local folder:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git@github.com:awslabs/nx-neptune.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;After defining your AWS credentials, run the &lt;a href=&quot;https://github.com/awslabs/nx-neptune/blob/main/cloudformation-templates/deploy.sh&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;deploy.sh&lt;/code&gt;&lt;/a&gt; script from the command line:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./cloudformation-templates/deploy.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-stack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;us-east-1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For custom setup instructions or troubleshooting, follow the template &lt;a href=&quot;https://github.com/awslabs/nx-neptune/blob/main/cloudformation-templates/README.md&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;README.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;open-the-neptune-notebook&quot;&gt;Open the Neptune notebook&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The CloudFormation stack deploys a Neptune Analytics graph instance along with a Neptune Notebook. The repository’s notebooks are included as assets within an Amazon SageMaker instance.&lt;/p&gt;
&lt;p&gt;In the AWS Console, open the Neptune service and go to &lt;strong&gt;Neptune | Notebooks&lt;/strong&gt;, where the notebook is listed as &lt;code dir=&quot;auto&quot;&gt;aws-neptune-nx-neptune&lt;/code&gt; by default. Open JupyterLab: choose &lt;strong&gt;Actions | Open JupyterLab&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://awslabs.github.io/nx-neptune/_astro/unlocking_graph_open_jupyterlab.CnNPdTL8_2oMNSL.webp&quot; alt=&quot;The Neptune Notebook Actions menu expanded, showing the Open JupyterLab option.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1502&quot; height=&quot;574&quot;&gt;&lt;/p&gt;
&lt;p&gt;Open &lt;code dir=&quot;auto&quot;&gt;notebooks/import_s3_table_demo.ipynb&lt;/code&gt; to continue.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;environment-variables-and-session-graph-name&quot;&gt;Environment variables and session (graph) name&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Run the notebook (using the &lt;code dir=&quot;auto&quot;&gt;conda_python3&lt;/code&gt; kernel) and make sure the environment variables are set correctly:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;NETWORKX_S3_IMPORT_BUCKET_PATH: s3://amzn-s3-demo-nx-neptune-us-east-1/import&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;NETWORKX_S3_EXPORT_BUCKET_PATH: s3://amzn-s3-demo-nx-neptune-us-east-1/export/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;NETWORKX_STAGING_BUCKET: s3://amzn-s3-demo-nx-neptune-us-east-1/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;NETWORKX_S3_TABLES_CATALOG=s3tablescatalog/your-catalog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;NETWORKX_S3_TABLES_DATABASE=your_database&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;You’ll need to set the catalog and database variables for the next step. You can set environment variables with the &lt;code dir=&quot;auto&quot;&gt;%env&lt;/code&gt; notebook command. For example:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;%env NETWORKX_S3_TABLES_CATALOG=AwsDataCatalog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;%env NETWORKX_S3_TABLES_DATABASE=default&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Also make sure the session name matches the application id provided. By default it is:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;session_name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;nx-neptune-graph&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;prepare-the-data&quot;&gt;Prepare the data&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Before running graph analytics, prepare your data in S3 Tables. The process has three steps: upload raw data to S3, create an Athena table to query it, and convert it to Iceberg format.&lt;/p&gt;
&lt;p&gt;For this walkthrough we use a table of transaction records — each row a directed event from one account to another, with an amount and a few attributes — but any tabular dataset that can be expressed as entities and the links between them works the same way.&lt;/p&gt;
&lt;p&gt;First, upload your source CSV to a dedicated folder in your S3 bucket — here, &lt;code dir=&quot;auto&quot;&gt;s3://amzn-s3-demo-nx-neptune-us-east-1/paysim/&lt;/code&gt;. Keeping the raw data in its own prefix matters: an Athena external table reads &lt;em&gt;every&lt;/em&gt; file under its &lt;code dir=&quot;auto&quot;&gt;LOCATION&lt;/code&gt;, so this folder should hold only the source CSV (not the import, export, or staging data).&lt;/p&gt;
&lt;p&gt;Second, because the pipeline expects data in Iceberg tables, convert the data from CSV to Iceberg format. Create an external Athena table pointing at the CSV folder:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;EXTERNAL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;span&gt; transactions (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;step &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; string,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;amount &lt;/span&gt;&lt;span&gt;float&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;nameOrig string,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;oldbalanceOrg &lt;/span&gt;&lt;span&gt;float&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;newbalanceOrig &lt;/span&gt;&lt;span&gt;float&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;nameDest string,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;oldbalanceDest &lt;/span&gt;&lt;span&gt;float&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;newbalanceDest &lt;/span&gt;&lt;span&gt;float&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;isFraud &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;isFlaggedFraud &lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ROW&lt;/span&gt;&lt;span&gt; FORMAT DELIMITED&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FIELDS TERMINATED &lt;/span&gt;&lt;span&gt;BY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;LOCATION&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;s3://amzn-s3-demo-nx-neptune-us-east-1/paysim/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;TBLPROPERTIES (&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;skip.header.line.count&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Convert the CSV table to an Iceberg table for better performance and ACID transactions:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;TABLE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;transactions_iceberg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WITH&lt;/span&gt;&lt;span&gt; (table_type &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;ICEBERG&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, is_external &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; false)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; transactions;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;define-graph-views-with-sql&quot;&gt;Define graph views with SQL&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;You use SQL to define a graph-structured view — nodes and edges — of your tabular data, written to a CSV file for Neptune import. Rather than hand-writing bespoke ETL jobs, you describe nodes and edges with standard Athena SQL queries, and the library runs the transform and load steps from those definitions.&lt;/p&gt;
&lt;div&gt;&lt;h4 id=&quot;defining-nodes&quot;&gt;Defining nodes&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;A Neptune Analytics node (or vertex) is an entity in the graph, identified by a unique &lt;code dir=&quot;auto&quot;&gt;~id&lt;/code&gt; (think primary key in SQL) and typed by &lt;code dir=&quot;auto&quot;&gt;~label&lt;/code&gt;. When you write the transform query, a unique &lt;code dir=&quot;auto&quot;&gt;~id&lt;/code&gt; and a &lt;code dir=&quot;auto&quot;&gt;~label&lt;/code&gt; are required; every other column becomes a property on the node.&lt;/p&gt;
&lt;p&gt;Here we model each account as a node. Every transaction row links two accounts — a sender and a receiver — so this query unions both sides into a single set of distinct account nodes:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT DISTINCT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;~id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;account&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;~label&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nameOrig&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;~id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; transactions_iceberg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nameOrig&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IS NOT NULL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;UNION ALL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nameDest&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;~id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; transactions_iceberg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nameDest&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IS NOT NULL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h4 id=&quot;defining-edges&quot;&gt;Defining edges&lt;/h4&gt;&lt;/div&gt;
&lt;p&gt;A Neptune Analytics edge (or relationship) connects two nodes by their &lt;code dir=&quot;auto&quot;&gt;~id&lt;/code&gt; — the &lt;code dir=&quot;auto&quot;&gt;~from&lt;/code&gt; and &lt;code dir=&quot;auto&quot;&gt;~to&lt;/code&gt; columns — with a relationship type given by &lt;code dir=&quot;auto&quot;&gt;~label&lt;/code&gt;. When you write the transform query, the &lt;code dir=&quot;auto&quot;&gt;~from&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;~to&lt;/code&gt;, and &lt;code dir=&quot;auto&quot;&gt;~label&lt;/code&gt; columns are required; every other column becomes a property on the edge. Property headers use a &lt;code dir=&quot;auto&quot;&gt;propertyname:type&lt;/code&gt; syntax, for example &lt;code dir=&quot;auto&quot;&gt;amount:Float&lt;/code&gt;. See &lt;a href=&quot;https://docs.aws.amazon.com/neptune-analytics/latest/userguide/loading-data-formats.html&quot;&gt;Neptune Analytics data formats&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Each transaction row is a directed relationship &lt;em&gt;from&lt;/em&gt; the sending account &lt;em&gt;to&lt;/em&gt; the receiving account. This query creates one edge per transaction, using the transaction type (for example, &lt;code dir=&quot;auto&quot;&gt;CASH_OUT&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;TRANSFER&lt;/code&gt;) as the &lt;code dir=&quot;auto&quot;&gt;~label&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nameOrig&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;~from&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nameDest&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;~to&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;~label&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;amount&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;amount:Float&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; transactions_iceberg&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nameOrig&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IS NOT NULL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;nameDest&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IS NOT NULL&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;provision-neptune-analytics-on-demand&quot;&gt;Provision Neptune Analytics on demand&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;A key advantage of this approach is on-demand compute. You don’t keep a graph database running — you provision a Neptune Analytics instance only when you need to run analytics.&lt;/p&gt;
&lt;p&gt;The library’s &lt;code dir=&quot;auto&quot;&gt;SessionManager&lt;/code&gt; handles instance lifecycle. It can run in a Jupyter notebook or a Lambda function:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; nx_neptune.session_manager &lt;/span&gt;&lt;span&gt;import&lt;/span&gt;&lt;span&gt; SessionManager, CleanupTask&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;session &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; SessionManager.&lt;/span&gt;&lt;span&gt;session&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;session_name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;graph-session&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;cleanup_task&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;CleanupTask.DESTROY&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;graph &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; session.&lt;/span&gt;&lt;span&gt;get_or_create_graph&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This single call either retrieves an existing graph or provisions a new one. Provisioning takes a few minutes, after which you have a fully managed graph engine ready to process your data.&lt;/p&gt;
&lt;p&gt;The &lt;code dir=&quot;auto&quot;&gt;SessionManager&lt;/code&gt; tracks every graph created within a session (using the session name as a prefix), making it easy to manage multiple workloads. When &lt;code dir=&quot;auto&quot;&gt;cleanup_task&lt;/code&gt; is defined, it releases those resources when you’re done. Any S3 Tables that hold your source data, or S3 buckets used for logs, are left for you to remove.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;load-the-graph&quot;&gt;Load the graph&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;The library runs the Athena queries behind the scenes, stages the results in S3, and loads them into Neptune Analytics — no manual CSV wrangling. The result is a graph view of millions of account nodes connected by transaction edges, projected straight from your data-lake tables:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;queries &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;ACCOUNTS_QUERY&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;TRANSACTIONS_QUERY&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; session.&lt;/span&gt;&lt;span&gt;import_from_table&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;graph&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;s3_import_location&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;queries&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;running-an-algorithm&quot;&gt;Running an algorithm&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;With the graph loaded, you can run algorithms using openCypher queries. Neptune Analytics exposes graph algorithms through built-in procedures. As an example, we’ll run &lt;a href=&quot;https://en.wikipedia.org/wiki/Louvain_method&quot;&gt;Louvain community detection&lt;/a&gt;, which partitions a graph into clusters of densely connected nodes.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Run Louvain community detection on Neptune Analytics and mutate the graph,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# storing each node&apos;s community in the &quot;community&quot; property.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;QUERY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;CALL neptune.algo.louvain.mutate({iterationTolerance:1e-07,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;writeProperty:&quot;community&quot;})&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;YIELD success AS success&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;RETURN success&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&quot;&quot;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;louvain_result &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; graph.&lt;/span&gt;&lt;span&gt;execute_query&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;QUERY&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# With writeProperty set, only a success/failure result is returned.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Remove &quot;writeProperty&quot; to return the community assignments directly.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;print&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;&quot;Louvain result: &lt;/span&gt;&lt;span&gt;{louvain_result}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The algorithm runs directly on Neptune Analytics infrastructure, processing millions of edges in seconds. The &lt;code dir=&quot;auto&quot;&gt;writeProperty:&quot;community&quot;&lt;/code&gt; parameter tells Neptune to annotate each node in place with its assigned community id — enriching the graph view without a separate post-processing step. Nodes that frequently connect to one another are grouped into the same community, so instead of scanning millions of individual rows you can reason about a much smaller number of clusters.&lt;/p&gt;
&lt;p&gt;The same pattern applies to the other algorithms Neptune Analytics supports — centrality, pathfinding, and more — either through openCypher or the NetworkX-compatible interface.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;visualizing-the-result&quot;&gt;Visualizing the result&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;You can query the enriched graph to inspect the community assignments. To visualize them, we recommend &lt;a href=&quot;https://github.com/aws/graph-explorer&quot;&gt;Graph Explorer&lt;/a&gt;. Open it from the AWS Console: go to &lt;strong&gt;Neptune | Notebooks&lt;/strong&gt;, select your notebook, and choose &lt;strong&gt;Actions | Open Graph Explorer&lt;/strong&gt;. (Graph Explorer connects to Neptune graphs, so it works against your Neptune Analytics instance rather than the raw tables.)&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://awslabs.github.io/nx-neptune/_astro/unlocking_graph_open_graph_explorer.BE3dT9MZ_1WicNN.webp&quot; alt=&quot;The Neptune Notebook Actions menu expanded, showing the Open Graph Explorer option.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1234&quot; height=&quot;538&quot;&gt;&lt;/p&gt;
&lt;p&gt;To see the largest communities, run the following openCypher query in Graph Explorer (using &lt;strong&gt;Search | &amp;#x3C;&gt; Query&lt;/strong&gt;):&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;MATCH&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;WITH&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;community&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;community&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;count&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;community_size&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;community_size&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;LIMIT&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;MATCH&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;community&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;community&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;MATCH&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;*1..3&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;RETURN&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;https://awslabs.github.io/nx-neptune/_astro/unlocking_graph_query_builder.me9J_qLf_Nxa69.webp&quot; alt=&quot;The Graph Explorer Search panel with the openCypher community query entered in the Query tab.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;1154&quot; height=&quot;888&quot;&gt;&lt;/p&gt;
&lt;p&gt;Running the query renders the communities as an interactive graph, with each element’s properties (edge label, source/target ids, amount, and any other attributes) available in the Details view.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://awslabs.github.io/nx-neptune/_astro/unlocking_graph_preview_graph_explorer.CFrtej3C_ZX431K.webp&quot; alt=&quot;Graph Explorer visualizing a community as a force-directed graph, with a selected CASH_OUT edge’s details shown in the side panel.&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;2200&quot; height=&quot;842&quot;&gt;&lt;/p&gt;
&lt;p&gt;Each node now carries a &lt;code dir=&quot;auto&quot;&gt;community&lt;/code&gt; property with its cluster assignment — ready to be exported back to your data lake.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;exporting-enriched-data-back-to-s3-tables&quot;&gt;Exporting enriched data back to S3 Tables&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;The final step closes the loop: export the enriched graph back to S3 Tables as Iceberg tables, making the results available to the rest of your data ecosystem — BI tools, ML pipelines, and downstream analytics.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;await&lt;/span&gt;&lt;span&gt; session.&lt;/span&gt;&lt;span&gt;export_to_table&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;graph&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;s3_export_location&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;csv_table_name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;transactions_csv&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;csv_catalog&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;AwsDataCatalog&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;csv_database&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;graph_demo&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;iceberg_vertices_table_name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;accounts_updated&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;iceberg_edges_table_name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;transactions_updated&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;iceberg_catalog&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;s3tablescatalog/nx-neptune-data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;iceberg_database&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;graph_demo&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This operation:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Exports the graph from Neptune Analytics to CSV in S3.&lt;/li&gt;
&lt;li&gt;Creates Athena tables pointing at the CSV data.&lt;/li&gt;
&lt;li&gt;Converts the CSV tables to Iceberg format in S3 Tables.&lt;/li&gt;
&lt;li&gt;Registers the new tables in your data catalog.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You end up with two new Iceberg tables in your data lake:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;accounts_updated&lt;/strong&gt; — every account node, now carrying its &lt;code dir=&quot;auto&quot;&gt;community&lt;/code&gt; property.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;transactions_updated&lt;/strong&gt; — every transaction edge with its properties.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;clean-up&quot;&gt;Clean up&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;When you’re done with the CloudFormation stack, tear it down with the teardown script:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;./cloudformation-templates/teardown.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-stack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;us-east-1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Or remove the resources manually:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Empty the bucket (including import/export data)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;aws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;s3://amzn-s3-demo-nx-neptune-us-east-1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--recursive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Delete the stack&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;aws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudformation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;delete-stack&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--stack-name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-stack&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;aws&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cloudformation&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wait&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;stack-delete-complete&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--stack-name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-stack&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;When your data lives in tables but your questions are about relationships, nx-neptune closes the gap. It packages a pipeline that projects the tables you already have into a graph on demand, runs algorithms on Neptune Analytics only for as long as you need the compute, and writes the enriched result back to Iceberg — so you don’t have to build the extract-transform-load plumbing yourself or keep a standing graph database running.&lt;/p&gt;
&lt;p&gt;Along the way you get:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Scalable graph analytics&lt;/strong&gt; over large datasets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reduced operational overhead&lt;/strong&gt; — Neptune Analytics manages the infrastructure, and the data load happens behind the scenes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Faster time to insight&lt;/strong&gt;, with results returning in seconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A path to enrich existing analytics&lt;/strong&gt; with relationship-aware features.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Get started with the &lt;a href=&quot;https://github.com/awslabs/nx-neptune&quot;&gt;nx-neptune library on GitHub&lt;/a&gt; or install the &lt;a href=&quot;https://pypi.org/project/nx-neptune/&quot;&gt;latest release from PyPI&lt;/a&gt;.&lt;/p&gt;</content:encoded><category>graph-analytics</category><category>neptune-analytics</category><category>data-lake</category></item><item><title>Welcome to the nx-neptune blog</title><link>https://awslabs.github.io/nx-neptune/blog/welcome/</link><guid isPermaLink="true">https://awslabs.github.io/nx-neptune/blog/welcome/</guid><description>Announcements, release notes, and deep dives on bringing graph analytics to your data lake with NetworkX and Amazon Neptune Analytics.</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Welcome to the &lt;strong&gt;nx-neptune&lt;/strong&gt; blog! This is where we’ll share release notes,
feature deep dives, usage patterns, and news about bringing graph analytics to
your data lake — powered by &lt;a href=&quot;https://docs.aws.amazon.com/neptune-analytics/latest/userguide/what-is-neptune-analytics.html&quot;&gt;Amazon Neptune Analytics&lt;/a&gt;,
and compatible with &lt;a href=&quot;https://networkx.org/&quot;&gt;NetworkX&lt;/a&gt; as a &lt;a href=&quot;https://networkx.org/documentation/stable/backends.html&quot;&gt;backend&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;get-started&quot;&gt;Get started&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href=&quot;https://github.com/awslabs/nx-neptune&quot;&gt;github.com/awslabs/nx-neptune&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Latest release:&lt;/strong&gt; &lt;a href=&quot;https://pypi.org/project/nx-neptune/&quot;&gt;nx-neptune on PyPI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Install the latest release with pip:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pip&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nx-neptune&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Have questions, ideas, or want to contribute? Open an issue or pull request on
&lt;a href=&quot;https://github.com/awslabs/nx-neptune&quot;&gt;GitHub&lt;/a&gt; — this project is in active
development and we welcome community feedback.&lt;/p&gt;
</content:encoded><category>announcements</category></item></channel></rss>