{"id":27370171,"url":"https://github.com/datastaxdevs/workshop-streaming-graph-quine","last_synced_at":"2025-10-14T16:09:59.808Z","repository":{"id":65370154,"uuid":"528798805","full_name":"datastaxdevs/workshop-streaming-graph-quine","owner":"datastaxdevs","description":"Workshop with Quine Partner showing power of Astra with Graph Analytics Quine.io","archived":false,"fork":false,"pushed_at":"2023-12-12T17:40:40.000Z","size":7233,"stargazers_count":3,"open_issues_count":0,"forks_count":5,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-04-13T08:57:09.211Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/datastaxdevs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-08-25T10:22:14.000Z","updated_at":"2023-01-19T20:56:30.000Z","dependencies_parsed_at":"2025-04-13T08:48:42.309Z","dependency_job_id":"28163511-c9e7-4e3e-9bac-fb3863ca042c","html_url":"https://github.com/datastaxdevs/workshop-streaming-graph-quine","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/datastaxdevs/workshop-streaming-graph-quine","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastaxdevs%2Fworkshop-streaming-graph-quine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastaxdevs%2Fworkshop-streaming-graph-quine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastaxdevs%2Fworkshop-streaming-graph-quine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastaxdevs%2Fworkshop-streaming-graph-quine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/datastaxdevs","download_url":"https://codeload.github.com/datastaxdevs/workshop-streaming-graph-quine/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/datastaxdevs%2Fworkshop-streaming-graph-quine/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267755631,"owners_count":24139463,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-29T02:00:12.549Z","response_time":2574,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-04-13T08:48:11.772Z","updated_at":"2025-10-14T16:09:54.771Z","avatar_url":"https://github.com/datastaxdevs.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🎓 Graph Streaming with Astra and Quine\n\nWelcome to the real-time graph ETL for modern data pipelines with **Quine and Apache Cassandra** workshop! In this two-hour workshop, we show how to combine a scalable database, `Apache Cassandra™`, with a powerful real-time streaming graph processor, `Quine`.\n\n⏲️ **Duration :** 2 hours\n\n🎓 **Level :** Intermediate\n\n![](data/img/splash.png)\n\nUsing **Astra DB**, the cloud-based _Cassandra-as-a-Service_ platform delivered by DataStax, we will cover the very first steps for every developer who wants to try to learn a new database: creating tables and CRUD operations.\n\nQuine, from the team at thatDot, is a real-time streaming graph interpreter. A server-side program that consumes data, builds a graph structure, and runs live computation on that graph to answer questions or compute results, and then stream them out.\n\nIt doesn't matter if you join our workshop live or you prefer to do it at your own pace, we have you covered. In this repository, you'll find everything you need for this workshop:\n\n\u003e [🔖 Accessing HANDS-ON](#-start-hands-on)\n\n## 📋 Table of contents\n\n1. [Objectives](#objectives)\n2. [Frequently asked questions](#frequently-asked-questions)\n3. [Materials for the Session](#materials-for-the-session)\n4. [Create your Database](#create-your-astra-db-instance)\n5. [Setup Quine](#setup-quine)\n6. [Graph Exploration](#graph-exploration)\n7. [Homework](#homework)\n8. [What's NEXT](#whats-next-)\n\n## Objectives\n\n1️⃣ **Give you an understanding of Quine streaming graph**\n\n2️⃣ **Show how to configure Quine to use Cassandra or Astra DB**\n\n3️⃣ **Provide an overview of Quine's Architecture**\n\n4️⃣ **Have you run a streaming scenario to detect an anomaly in the graph**\n\n🚀 **Have fun with an interactive session!**\n\n## Frequently asked questions\n\n\u003cp/\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e 1️⃣ Can I run this workshop on my computer?\u003c/b\u003e\u003c/summary\u003e\n\u003chr\u003e\n\u003cp\u003eThere is nothing preventing you from running the workshop on your own machine. If you do so, you will need the following installed on your local system:\n\u003col\u003e\n\u003cli\u003e\u003cb\u003egit\u003c/b\u003e\n\u003cli\u003e\u003cb\u003eJava 11\u003c/b\u003e\n\u003c/ol\u003e\n\u003c/p\u003e\nIn this readme, we try to provide instructions for local development as well - but keep in mind that the main focus is development on Gitpod, hence \u003cstrong\u003ewe can't guarantee live support\u003c/strong\u003e about local development in order to keep on track with the schedule. However, we will do our best to give you the info you need to succeed.\n\u003c/details\u003e\n\u003cp/\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e 2️⃣ What other prerequisites are required?\u003c/b\u003e\u003c/summary\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eYou will need enough *real estate* on screen, we will ask you to open a few windows and it would not fit on mobiles (tablets should be OK)\n\u003cli\u003eYou will need an Astra account: don't worry, we'll work through that in the following\n\u003cli\u003eAs \"Intermediate level\" we expect you to know what Java is.  If you don't know what a streaming graph is, or haven't used a graph system before, that's ok...we'll cover that.\n\u003c/ul\u003e\n\u003c/p\u003e\n\u003c/details\u003e\n\u003cp/\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e 3️⃣ Do I need to pay for anything for this workshop?\u003c/b\u003e\u003c/summary\u003e\n\u003chr\u003e\n\u003cb\u003eNo.\u003c/b\u003e All tools and services we provide here are FREE. FREE not only during the session but also after.\n\u003c/details\u003e\n\u003cp/\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003e 4️⃣ Will I get a certificate or badge if I attend this workshop?\u003c/b\u003e\u003c/summary\u003e\n\u003chr\u003e\nAttending the session is not enough. You need to complete the homework detailed below and you will get a nice badge that you can share on LinkedIn or anywhere else *(open badge specification)*\n\u003c/details\u003e\n\u003cp/\u003e\n\n## Materials for the Session\n\nIt doesn't matter if you join our workshop live or you prefer to work at your own pace,\nwe have you covered. In this repository, you'll find everything you need for this workshop:\n\n- [Slide deck](./slides.pdf)\n- [Discord chat](https://dtsx.io/discord)\n- [Questions and Answers](https://stackoverflow.com/questions/tagged/cassandra/)\n- [Twitch backup](https://www.twitch.tv/datastaxdevs)\n\n----\n\n# 🏁 Start Hands-on\n\n## Create your Astra DB instance\n\n_**`ASTRA DB`** is the simplest way to run Cassandra with zero operations at all - just push the button and get your cluster. No credit card required, 40M read/write operations and about 80GB storage monthly for free - sufficient to run small production workloads. If you end your credits the databases will pause, no charge_\n\nLeveraging the [database creation guide](https://awesome-astra.github.io/docs/pages/astra/create-instance/#c-procedure), create a database. *Right-Click the button* with *Open in a new TAB.*\n\n\u003ca href=\"https://astra.dev/2-16\"\u003e\u003cimg src=\"data/img/create_astra_db.png?raw=true\" /\u003e\u003c/a\u003e\n\n|Field|Value|\n|---|---|\n|**Database Name**| `workshops`|\n|**Keyspace Name**| `quine`|\n|**Regions**| Select `GOOGLE CLOUD`, then Moncks Corner (us-east1) OR an Area close to you, then a region with no LOCK 🔒 icons, those are the region you can use for free.   |\n\n\u003e **ℹ️ Note:** If you already have a database `workshops`, simply add a keyspace `quine` using the `Add Keyspace` button on the bottom right hand corner of db dashboard page.\n\nWhile the database is being created, you will also get a **Security token**:\nsave it somewhere safe, as it will be needed later in other workshops (In particular the string starting with `AstraCS:...`.)\n\nThe status will change from `Pending` to `Active` when the database is ready, this will only take 2-3 minutes. You will also receive an email when it is ready.\n\n#### Token\n\n\u003e **⚠️ Important**\n\u003e ```\n\u003e The instructor will show you on screen how to create a token\n\u003e but will have to destroy to token immediately for security reasons.\n\u003e ```\n\n[🏠 Back to Table of Contents](#-table-of-content)\n\n## Setup Quine\n\nThese instructions were written using Java 11.10.  To run Quine locally, follow the steps below.  Or, you can run it in GitPod:\n\n[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/datastaxdevs/workshop-streaming-graph-quine)\n\n### Setup Astra Shell in GitPod\n\nThe Astra Shell tool will be included in the GitPod build.  Once the environment has completed its initial build, you should see the following at the bottom of the terminal:\n\n```bash\nOpen A NEW TERMINAL and run: astra setup\n```\n\nOpen a new terminal by clicking the plus ( + ) icon on the upper-right corner of the current terminal window.  Then run:\n\n```bash\nastra setup\n```\n\nYou will be prompted to enter (paste) your token.\n\n```bash\n• Enter your token (starting with AstraCS) :\n```\n\nOnce you it \u003ckbd\u003eenter\u003c/kbd\u003e, you should see output similar to below:\n\n```\n[rags@acm.org]\n\u003e ASTRA_DB_APPLICATION_TOKEN=AstraCS:AAAAAAAA\n\u003e\n\u003e [What's NEXT ?]\n\u003e You are all set.(configuration is stored in ~/.astrarc) You can now:\n\u003e    • Use any command, 'astra help' will get you the list\n\u003e    • Try with 'astra db list'\n\u003e    • Enter interactive mode using 'astra'\n\u003e\n\u003e Happy Coding!\n```\n\nVerify the setup with the following command which should list all the databases:\n\n```\nastra db list\n```\n\nOpen a new terminal window and run Quine by executing:\n```bash\n./start.sh\n```\n\n### Download Quine - Local\n\nFollow the [Download Quine page](https://quine.io/download) to download the JAR. Choose/create a directory for Quine, and copy the JAR to another location:\n\n```bash\nmkdir -p ~/local/quine\ncp quine-1.3.2.jar ~/local/quine/\n```\n\n### Configure Quine - Local\n\nCreate a `quine.conf` file inside the quine directory:\n\n```bash\ncd ~/local/quine\ntouch quine.conf\n```\n\nEdit the `quine.conf` file:\n\n```\nquine.store {\n  # store data in an Apache Cassandra instance\n  type = cassandra\n  # the keyspace to use\n  keyspace = quine\n  should-create-keyspace = false\n  should-create-tables = true\n  replication-factor = 3\n  write-consistency = LOCAL_QUORUM\n  read-consistency = LOCAL_QUORUM\n  local-datacenter = ${ASTRA_DB_REGION}\n  write-timeout = \"10s\"\n  read-timeout = \"10s\"\n}\ndatastax-java-driver {\n  advanced {\n    auth-provider {\n      class = PlainTextAuthProvider\n      username = \"token\"\n      password = ${ASTRA_DB_APP_TOKEN}\"\n    }\n  }\n  basic {\n    cloud {\n      secure-connect-bundle = \"/workspace/workshop-streaming-graph-quine/secure-connect-workshops.zip\"\n    }\n  }\n}\n```\n\n#### Astra-Specific Settings:\n\n`type = cassandra` - If the type is not specified, Quine defaults to use RocksDB.\n\n`should-create-keyspace = false` - Remember keyspaces can only be created in Astra via the dashboard.\n\n`replication-factor = 3` - Defaults to 1 if not set, which will not work with Astra DB.\n\n`write-consistency = LOCAL_QUORUM` - Minimum consistency level required by Astra.\n\n`read-consistency = LOCAL_QUORUM` - Minimum consistency level required by Astra.\n\n`local-datacenter = \"us-east1\"` - Set your Astra DB cloud region as the local DC.\n\n`username = \"token\"` - No need to mess with this. Just leave it as the literal word \"token.\"\n\n`password` - A valid token for an Astra DB cluster.\n\n`secure-connect-bundle` - A valid, local file location of a downloaded Astra secure connect bundle. The driver gets the Astra DB hostname from the secure bundle, so there is no need to specify endpoints separately.\n\n### Download the recipe and sample data - Local\n\nDownload the \"Password Spraying\" [recipe](https://raw.githubusercontent.com/datastaxdevs/workshop-streaming-graph-quine/main/password-spraying-workshop.yml) from Github. Move the resulting YAML file to your `quine` directory.\n\n```bash\nmkdir ~/local/quine\ncp password-spraying-workshop.yml ~/local/quine/\n```\n\nThen, download the [sample data file](https://that.re/attempts)\" and move the JSON file to your `quine` directory.\n\n```bash\nmkdir ~/local/quine\ncp attempts.json ~/local/quine/\n```\n\nAlternatively, if you have cloned this repository and are working in the repo directory locally, you can run the `get_quine.sh` script. If successful, the script will download the latest version of Quine and the sample data for this workshop, and the script will output something similar to what you see below.\n\n```shell\n❯ ./get_quine.sh\n\nHTTP request sent, awaiting response... 200 OK\nLength: 220704180 (210M) [application/octet-stream]\nSaving to: ‘quine-1.3.2.jar’\n\nquine-1.3.2.jar        100%[=========================================================\u003e] 210.48M  20.5MB/s    in 22s     \n\n2022-10-06 11:13:39 (9.78 MB/s) - ‘quine-1.3.2.jar’ saved [220704180/220704180]\n\nHTTP request sent, awaiting response... 200 OK\nLength: 82243423 (78M) [application/json]\nSaving to: ‘attempts.json’\n\nattempts.json          100%[=========================================================\u003e]  78.43M  15.4MB/s    in 5.0s    \n\n2022-10-06 11:13:49 (15.8 MB/s) - ‘attempts.json’ saved [82243423/82243423]\n```\n### Starting Quine - Local\n\nTo run Quine using the Password Spray recipe, invoke the JAR with Java, while passing the `quine.conf` as a `config.file` JVM parameter, while also specifying the recipe, like this:\n\n```bash\ncd ~/local/quine\njava -Dconfig.file=quine.conf -jar quine-1.3.2.jar -r password-spraying-workshop.yml --force-config\n```\n\n### Troubleshooting\n\nIf Quine starts correctly, it should produce output similar to below:\n```bash\n2022-06-15 15:11:52,666 WARN [NotFromActor] [s0-io-4] com.datastax.oss.driver.internal.core.cql.CqlRequestHandler - Query '[0 values] CREATE TABLE IF NOT EXISTS journals (quine_id blob,timestamp bigint,data blob,PRIMARY KEY(quine_id,timestamp)) WITH CLUSTERING ORDER BY (timestamp ASC) AND compaction={'class':'TimeWindowCompactionStrategy'}' generated server side warning(s): Ignoring provided values [compaction] as they are not supported for Table Properties (ignored values are: [additional_write_policy, bloom_filter_fp_chance, caching, cdc, compaction, compression, crc_check_chance, dclocal_read_repair_chance, extensions, gc_grace_seconds, id, max_index_interval, memtable_flush_period_in_ms, min_index_interval, nodesync, read_repair, read_repair_chance, speculative_retry])\nGraph is ready!\nApplication state loaded.\nQuine app web server available at http://0.0.0.0:8080\n```\n\nQuine should then start ingesting the data stream automatically, displaying its progress as it moves along.\n\nIf the output does not read:\n\n```\nGraph is ready!\nApplication state loaded.\nQuine app web server available at http://locahost:8080\n```\n\nThen look for exceptions.\n\n#### Incorrect database name\n\nIf you see this error:\n\n```bash\nDownloading Astra secure connect bundle...\nPicked up JAVA_TOOL_OPTIONS:  -Xmx3489m\n[WARN ] - Database workshops has not been found\n[WARN ] - Database 'workshops' has not been found.\n[ERROR] - NOT_FOUND: Database 'workshops' has not been found.\nDownload of SCB failed!\n```\n\n...this means that your token is not associated with a database named 'workshops'.  Edit the `.env` file with the following GitPod command:\n\n```bash\ngp open .env\n```\n\nEnter the correct name for your database, and rerun `start.sh`.\n\n#### Snapshots table fails to CREATE\n\nIf you see an error:\n\n```\ncom.datastax.oss.driver.api.core.servererrors.InvalidQueryException: Clustering key columns must exactly match columns in CLUSTERING ORDER BY directive\n```\n\n...this means that one of tables (likely the `snapshots` table) failed to CREATE properly.  From GitPod, you can fix this by using the Astra Shell.  If your DB name is different from \"workshops,\" replace it as appropriate.\n\n```bash\nastra db cqlsh workshops\n```\n\nCheck to ensure the `snapshots` table exists:\n\n```\ncqlsh\u003e use quine;\ncqlsh\u003e desc quine;\n```\n\nIf not, execute this CQL in Astra Shell (or cqlsh if you're running locally) to create it:\n\n```\nCREATE TABLE quine.snapshots (\n    quine_id blob,\n    timestamp bigint,\n    multipart_index int,\n    data blob,\n    multipart_count int,\n    PRIMARY KEY (quine_id, timestamp, multipart_index)\n) WITH CLUSTERING ORDER BY (timestamp DESC, multipart_index ASC)\n    AND additional_write_policy = '99PERCENTILE'\n    AND bloom_filter_fp_chance = 0.01\n    AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}\n    AND comment = ''\n    AND compaction = {'class': 'org.apache.cassandra.db.compaction.UnifiedCompactionStrategy'}\n    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}\n    AND crc_check_chance = 1.0\n    AND default_time_to_live = 0\n    AND gc_grace_seconds = 864000\n    AND max_index_interval = 2048\n    AND memtable_flush_period_in_ms = 0\n    AND min_index_interval = 128\n    AND read_repair = 'BLOCKING'\n    AND speculative_retry = '99PERCENTILE';\n```\n\n#### Clearing Quine Data\n\nIf Quine starts, but you see a message which looks like this:\n\n```bash\nStanding Query STANDING-1 already exists\nStanding Query STANDING-2 already exists\nIngest Stream INGEST-1 already exists\n```\n\n...that means that you'll need to clear the existing data before proceeding.  You can do this by running the `truncate_tables.sh` script from within GitPod.\n\n#### Extra Double Quote on STANDING-2 Link\n\nOnce you seen the message indicating that an anomaly has been found, you should be able to \u003ckbd\u003eCtrl\u003c/kbd\u003e+click or \u003ckbd\u003eCommand\u003c/kbd\u003e click to open the Quine Graph Explorer with a query for that pattern match.  However, sometimes the new tab will open and the page load will fail due to an extra double-quote on the end of the query.  Simply click on the query text well, and press \u003ckbd\u003eEnd\u003c/kbd\u003e to go to the end of the line.  If you see a double quote there, \u003ckbd\u003ebackspace\u003c/kbd\u003e over it.\n\n### Quine Graph Explorer\n\nYou can now use Quine's visual graph explorer in a web browser, and create/traverse data with either Gremlin or Cypher: http://localhost:8080/\n\n[🏠 Back to Table of Contents](#table-of-contents)\n\n## Graph Exploration\n\nThe `attempts.json` contains the pattern for one password spraying attack. Quine will produce an alert in the console when the standing query matches the pattern. The alert will look similar to this:\n\n```shell\n2022-10-07 09:37:46,255 Standing query `alert` match: {\"meta\":{\"isPositiveMatch\":true,\"resultId\":\"7242b979-03c2-2bc3-9879-13661e8359b5\"},\"data\":{\"QuineUILink\":\"Password Spraying Attack: http://localhost:8080/#MATCH%20(user)-[:ORIGINATED]-%3E(attempt1%20%7BoutcomeResult:%22FAILURE%22%7D)-[:NEXT]-%3E(attempt2%20%7BoutcomeResult:%22FAILURE%22%7D)-[:NEXT]-%3E(attempt3%20%7BoutcomeResult:%22FAILURE%22%7D)-[:NEXT]-%3E(attempt4%20%7BoutcomeResult:%22FAILURE%22%7D)-[:NEXT]-%3E(attempt5%20%7BoutcomeResult:%22SUCCESS%22%7D)%20WHERE%20id(attempt1)=%22cb73fb14-4686-3913-8cd8-7d4d608b53d5%22%20RETURN%20DISTINCT%20user%2Cattempt1%2Cattempt2%2Cattempt3%2Cattempt4%2Cattempt5\"}}\n```\n\nWhen the alert arrives, hold down the command key on a MAC and right-click the link to open Quine.\n\nYou should be able to arrange the graph in your browser into a shape similar to this:\n\n![quine exploration ui](data/img/quine-exploration-ui.png)\n\nExplore the graph using the [Exploration UI](https://docs.quine.io/getting-started/exploration-ui.html) to follow the path of the attack in the event stream.\n\n## Stopping Quine\n\nTo stop Quine, you can simply hit \u003ckbd\u003eCtrl\u003c/kbd\u003e+\u003ckbd\u003ec\u003c/kbd\u003e.  Or, you can run the `stop.sh` file from a terminal (locally or from within GitPod).\n\n## Homework\n\nTo submit the **homework**,\n\n* Write a new recipe or extend an existing one and take SCREENSHOT(s).\n  * Visit the Quine [documentation](https://docs.quine.io/docs.html) site\n  * Go through the Getting Started -\u003e [Quine Recipes](https://docs.quine.io/getting-started/recipes-tutorial.html) tutorial\n  * Create a new recipe from scratch, or...\n  * Modify an [existing recipe](https://quine.io/recipes) to do something new\n  * Email the SCREENSHOT(s) of Quine running your recipe in the browser and the recipe YAML file\n\nEMAIL:\n```text\nTo: aaron.ploetz@datastax.com, michael@thatdot.com\nSubject: Quine Homework\n```\n\n## What's NEXT ?\n\nWe've just scratched the surface of what you can do using Astra DB, built on Apache Cassandra.\nGo take a look at [DataStax for Developers](https://www.datastax.com/dev) to see what else is possible.\nThere's plenty to dig into!\n\nCongratulations: you made to the end of today's workshop.\n\n**... and see you at our next workshop!**\n\n\u003e Sincerely yours, The DataStax Developers\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatastaxdevs%2Fworkshop-streaming-graph-quine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdatastaxdevs%2Fworkshop-streaming-graph-quine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdatastaxdevs%2Fworkshop-streaming-graph-quine/lists"}