Video: Build Your First Knowledge Layer | Duration: 7428s | Summary: Build Your First Knowledge Layer | Chapters: Workshop Introduction (3.2s), Workshop Setup (83.135s), Workshop Introduction (221.235s), Auto Repair Use Case (285.235s), Data Integration Challenge (376.88s), Vector Search Limitations (462.13s), Graph Concepts Overview (555.48s), Property Graph Model (620.205s), Knowledge Layer Explained (711.96s), Architecture Overview (828.39s), Local Setup Configuration (996.88s), Sandbox Setup (1167.73s), Terminal Setup Configuration (1304.52s), Q&A and Setup (1469.94s), Environment Setup Check (1629.98s), Model Evaluation Discussion (1710.48s), Context Shapes Concept (1854.375s), Semantic Layer Setup (1977.285s), Running Python Script (2246.54s), Cypher Query Demonstration (2407.535s), MCP SQL Execution (2607.725s), Finding Connection Details (2780.56s), Q&A Session (2828.195s), Scaling Neo4j (2917.14s), Q&A Session (3101.755s), Document Navigation Structure (3345.935s), Graph Visualization Demo (3591.98s), Neo4j CLI Tools (3873.94s), Search Implementation (4160.095s), Domain Concept Nodes (4664.81s), Schema Visualization (4874.66s), Theme-Based Clustering (4997.57s), Graph Clustering Setup (5207.605s), Theme Detection (5507.35s), Theme ID Questions (5691.245s), Workflow Adaptation Questions (5896.24s), Neo4j CLI (6130.06s), Complex Query Integration (6308.675s), Wrap-up and Q&A (6701.635s), Document Version Control (7197.51s), Closing & Resources (7284.16s)
Transcript for "Build Your First Knowledge Layer": Okay. Good morning, good evening, good afternoon, and welcome to our next road to notes workshop. This one is, how to build a knowledge layer. Build your first knowledge layer is is what it's called. And, you know, you get, the... We we did, we did an intro session, in the beginning. We did an anti hallucination workshop last week, and now we we are doing this. And it's like, it's it's a little bit around the same theme. You have... You you get confident answers that are completely wrong, from from your agents, and you wanna make sure that these these answers get get better, that these answers get actually to the point where you want them to be. And, my my colleagues, Zach and Ryan, will will show you in this hands... How... Hands on workshop how to build, a lightweight knowledge layer with Neo four j on top of it, of course, how to work with various documents with with some, structured data, with some unstructured data, probably. And, and you'll have a a bit of a over... Overview how you can, build that, yourself and how, how you can then take this as a as a blueprint for for your, agentic or AI builds that you go on in the future. It's gonna be Did we lose Alex there? I I think I think we might have lost Alex. So I'll I'll continue where he left off. So we are going to go over building your first knowledge layer. This is gonna be a hands on workshop. Basically, what we have here... Let me start sharing my screen so we can see here. Give me one second. Trying to figure out. Here we go. We can build knowledge layers, but sharing our screen is still difficult for us sometimes. So there's there's basically two links that are gonna be important for you all, and, hopefully, they'll get posted in the chat here really quick. And if they don't, Alex or Ryan, just help me out and, put them in there. So there's the actual workshop course, which if you open it, it's a GraphAcademy workshop. You'll go and sign in if you're not already a part of GraphAcademy, enroll in the workshop, and there's directions there. You can even do it without us talking. You can do it yourself. The one thing you will need as well is there's a credentials file. And if you go to that link, there's going to be an anthropic key and a a Databricks key, which we'll be using for our warehouse. Now I wanna just say we are giving an anthropic key for everyone to use. I... We're all adults. We can all use keys responsibly. It... I'll be watching it. So if if someone... Just just, you know, use your common sense. Don't take it and and go off and run with it and do other things outside of the workshop. We'll turn it off after the workshop is over. If it turns out that someone is abusing the key, unfortunately, I'll have to shut it off, and then, you know, it'll be deactivated for everyone. If you have your own key that you wanna use, if you have... If you wanna use Cloud Code with your own... Anthropic key or just your own subscription, you're perfectly fine to do that as well. It won't make a difference for the workshop. It's just we wanna make sure everyone has access to Anthropic and Claude if you don't already because we're gonna be depending on Claude code. So I'm gonna go through some slides very, very quickly before we start just to level set on the idea of what we're doing here. So, we talk about knowledge layers a lot, and... At Neo four j, and I really wanted to create something that, just sort of from a concrete level, how do you actually build something like this? A simple version, not like the big complicated six to eight layer version that you might end up within a big enterprise, but, like, what's your, like, one zero one knowledge layer look like? So we got a great team here to put together a workshop for you. It includes Ryan who's on the call, who's a senior partner architect, who's helped particularly with the connectors to Databricks and some of the back end stuff, Ben Squire who's our developer... One of our developer advocates who's helped test the course and walk through it and sort of how do you make it, sort of a better learning experience, and then myself, and I'm an AI researcher here at Neo four j. So what we're going to do is we're gonna take a business use case around... Think of it like an auto repair chain. So we have these in in The United States where you... There's these big groups that run, like, oil changes, and they'll do, like, other diagnostic checks and stuff, and you can bring your car into them. And imagine that they have a ton of documents, like bulletins about cars and recalls and stuff, plus they might also have transactions that they keep inside of an operational store and then eventually put inside of a data warehouse. So, like, all past repairs, you know, and, like, different transactions they've had with customers, and so forth. And there's multiple different types of personas that might be interested in different problems around that business. So, for example, a technician might have a problem around finding a particular fix. You might have more senior individuals inside of the organization wondering about, like, how do I, actually get AI implemented, so everyone can use it, and how can I ask more analytical questions for reporting, like, you know, what are we missing, what are our blind spots, all this sort of stuff? And then you have AI engineers, which might be a lot of us on the call that actually has to have to build a copilot for all of this stuff. Right? And in this case, the data that we'll be working with, this is all simulated, but it comes in two parts, a structured part and an unstructured part. So as I was saying before, we have a lake house, and inside of the structured part is gonna be tables around your work orders. So your vehicles, different codes for those vehicles, procedures, the work orders, and then different parts that are being used. And they have primary and foreign key relationships, that are implied, I think, inside of, Databricks and some of these other data warehouses, like BigQuery, for example. And then you're gonna have your documents, which in this case, we're just modeling with PDFs. These are gonna be manuals, service bulletins, and recall notices. So, basically, like safety or issues, that a manufacturer has with a certain vehicle, that's important for someone who's gonna be, you know, building or or fixing, fixing vehicles. And so I... We've made it to a point where retrieval from those data sources is not a problem. Right? You can retrieve documents and warehouse data fairly easily. There's Texas SQL tools often by these vendors that have data warehouses like Snowflake and Databricks, and there's VectorSearch to retrieve from documents. So, like, getting the data is not the problem. The the problem is how do you combine that data, and how do you basically navigate through it in a reasonable way, where the AI model has all the context it needs. And there's certain very specific instances where this becomes a really big problem. For example, if you wanna really navigate your documents, like, say, hey. I have a work order, and then that connects to a series of manuals and safety bulletins. Just doing, like, vector search on these documents, you're searching, but that search may have holes in it or it may, like, over index on just, like, one piece of documentation and give you a lot of duplicate results. So you have this, like, precision recall problem where you're not, like, recalling all the information you need. And sometimes if you have a really low, like, k return, you suffer with your precision. So, you know, you you need to go a little bit beyond just semantic search and maybe navigate the links inside of your documents, the structure of it. And similarly, if you have to look at... Sort of ask questions about negatives, like what doesn't exist in my data or where is something missing that's very hard with vector search, and, of course, trying to find connections between different things. So, like, how do I sort of connect out my unstructured data and find the connections to my structured text to SQL data and make sure that, you know, even with inside of my, tables that I'm connecting between the tables efficiently according to sort of the business language or this sort of the business semantics, that people who actually work at the business use. And so we're going to look at three specific shapes, to help us with this. So those are gonna be creating tables of contents or trees, out of our documents. We're gonna be looking at connections, which is like how do you form paths, particularly between your structured, lakehouse data or or data warehouse data, and themes, which is gonna be how do you extract communities and surface patterns that, no one really named beforehand. So, like, so tell me about my... Like, basically, if I don't know what I'm looking for, but I wanna sort of uncover, you know, contradictions or areas where I'm missing or or common patterns inside of my data, reoccurring themes, how do I how do I find that? And I'm sure a lot of you, if you're here, you might already know a lot about graphs. But I'm just going to explain Neo four j and how we think about graphs very, very quickly so everyone's, sort of up to the same level because we're gonna be using graphs to express these shapes and get over these problems that I was talking about before. So when we refer to a graph here at Neo four j, we're often referring to a property graph data model. There's other types of graph data models. At the end of the day, they all model effectively the same thing. This one is just very, very simple and easy to understand. So there's three elements inside of a property graph data model that are important to know about. There's nodes, which represent people, places, and things. Right? So entities. There's relationships, which are the verbs or associations between those people, places, and things. So you can see here, you can have a person own a car, or you can have a person drive a car, or you can have relationships between people, like a person is the brother or a sister of another person. And then the other really key part is... Are the properties, which are... Could be strings. They could be dates. They could be vectors, for example, for vector search. They could be lists of things. They could be dates. They could be numbers. All these different things that can go on both attributes of nodes and relationships. That helps with search and filtering and all sorts of stuff that we'd use. And the idea, right, is that it's almost like pre joined tables because instead of having primary and foreign keys, I can go between nodes, multi hops very easily. Everything's just already, you know, already, prejoined together, so you can just zip through everything. And when we talk about the knowledge layer, which is the... Which is our title for this, it might be helpful just to explain what this is. Right? So, like, a knowledge layer, you can think of it as existing between your agents or your end users and your source data. And this knowledge layer where Neo four j fits inside of the stack can hold lots of useful information, graphs of various types, knowledge graphs, which tell you about your semantic knowledge, how things are related together, ontologies that tell you about your semantics and your schemas and how they relate to the real world and define meaning in your data. Memory can go in here. Business rules, procedural knowledge, so, like, how do you actually do tasks. And all these things help your AI models become more accurate. They give you a form of governance and explainability, and you can distill and connect a lot of your agent knowledge and human experience inside of this knowledge layer and make it portable so you can plug any agent into it and you can share this knowledge between agents. Now there's lots of components to a knowledge layer, and what we're focusing on today is really more going to be this knowledge graph side and this ontology or semantic layer side with a little bit of business rules mixed in. And in other talks, we... You know, there's lots of information that we provide on memory. How do you make cool... These cool memory graphs or virtual graphs and context graphs and procedural knowledge? And I cover those in other talks as do a lot of my colleagues. And you can easily extend what we're doing here. But here, I wanna give you sort of that basic foundation for a one zero one knowledge layer, which is why I'm focusing mostly on these two and a half areas. And this is what it's gonna look like, when we jump into the workshop. So, basically, what we're gonna build today is you're gonna have your agent here, and your lake house. In this case, we're gonna use Databricks. You'll have your structured tables and documents I was going over. We are going to bake a semantic layer graph with something called Neocarta that's gonna be like an ontology in a way. And someone's asking if we can have access to the slides. I can share them after. If you go to the workshop, the workshop has these images in there too. So it doesn't have every image that I showed you, but it... Like, this diagram is inside of the workshop. So you'll you'll have access to these. But, yes, I can, I could look at this sharing them here, after after the talk? The semantic layer, again, is gonna be a reflection of what's in the warehouse, and it will tell the agent how to write really good text to SQL. And then our documents, we're actually going to parse and ingest into the graph. And I'm gonna do this in a way that's idempotent. So I'll get into that when when we get to that piece. But oftentimes, people struggle with entity resolution because... Or not entity resolution, but entity extraction. Some of those workflows can be a little bit tricky if you approach them for the first time. I'm gonna do something here that focuses more on the structure of documents. So it's very, very simple deterministic code that you can then enrich later with entity extraction if you want. So, again, with that sort of one zero one, here's just the starting knowledge layer type of theme. So with that in mind, we're gonna jump into the course, and let me switch my tab over. So, can someone tell me, Martin or Alex, did we post in the chat the links to these two things here? Let me check. Yeah. Yes? Yeah. Okay. So so so so everyone has this. These... Okay. Yeah. These are posted and also pinned to the top of the, of the workshop chat. So if you don't see them right now, then please scroll look at the pinned messages. There is the workshop content, and there is also the the credentials content that you shared in this Google Docs file with the API keys. Okay. Awesome. Perfect. So here's here's the start of the workshop. Now I already did most of this overview. So, you know, you... You've got that already. The next thing I want you to do is go to the... Your environment piece, and you're gonna open... So I'll walk through these steps. You're gonna open in GitHub code spaces an environment to do this if you wanna follow along. Now if you want, you could run this locally too. Like, the... All the code for this is open source, so you can go to the repo that has all the code and you can start running this locally. You can hook this up to or in whatever you wanna do. If not, you can go ahead and, you know, create a new one in in code space. I've already got a code space here that I'm working on, so I'm not gonna press any buttons here. But that's what you would do. Once you're in here, basically, what you need to do is that it's gonna take a while to spin up. So this will this will take, like, three to five minutes to spin up. There's an environments file, and you're gonna need to fill these things in. And that's where the credentials file that we have from before is gonna come in. So, basically, what you're going to do, if I scroll down here, is there's an anthropic AI key and there's these data warehouse keys. Here's the workshop credentials. It feels very naughty of me to be showing workshop credentials on screen sharing them, but we're gonna tear all this down afterwards. So... And, you know, please use this responsibly. So I am, and then, basically, I'm gonna I'm gonna go into my environment, and I'm going to, paste all that in. And then... Oh, actually, I pasted over the wrong thing. So there's the anthropo key. And then the warehouse stuff, you're gonna wanna put down by where we have all the warehouse stuff down here. So I'm gonna put that in down here. And then, basically, you have that in, and then you're going to need to start a sandbox for Neo four j. Now... And it will give you directions here, on how to do that. You have to go to open sandbox. And then once you're here, I already have a graph data science, sandbox selected because I was, you know, running this beforehand in preparation. But for you, you would go to a new project, and then I don't have it for me because I already have one, but it should be under your own data. Not an ordinary blank sandbox, but blank sandbox with graph data science. And it should show you in a picture here, what that looks like, when you're setting up. So it's it's blank sandbox graph data science. There is a way to hook this up with Aura too. So while you guys are going through and doing this, I'll say that, I... At some point, we're gonna update this course to use Aura. The the only thing blocking that is a technicality around, how to do some of the GDS stuff when you make projections because it uses a different mechanism there, for... It's... I don't wanna get into it for this for this workshop. It... It's a it's a it's a technical detail. And we actually say, Ryan had put in down here kind of what you would need to fix in the workshop to make it work with Aura, which is our cloud offering. But for today, we'll use Sandbox. After today, I'd actually recommend looking at... If you go back to that credentials and you look at these directions, I'd recommend, going in here and and following that and using Aura instead of a GDS sandbox. The experience is just gonna be, likely a lot better. Okay. So, anyway, once once you get this created, you'll open up your sandbox for you. It should be blank. Basically, if if I if I open my sandbox, it it will come up with credentials, and, you basically just have to go through and plug in your connection details. The username for this is just gonna be e l four j and then your password. And then when I connect to mine, it'll show me that I have, sure. We'll save. It'll show me that I have stuff inside of my graph because I was running before. For you, it'll be nothing because it's just a fresh, blank sandbox. Once once that is up, you basically take your credentials. You'll... When you go through and do this, you'll download credentials. It'll give you a file to download. And you take those and you put them into your environment's file. So for me, they came in. I have mine here, so I just go copy. And then I would go to, my my code space, and I just stick them in right here inside of my environments file. Once all of that's done, and many of you might still be waiting for all this to spin up, You're going to start Claude, and it will bring you through a series of steps. So if I go here... And and another thing too is this bash script, this was, the bash terminal rather was initiated often. It's a race condition before the environment, file was created and before you put your credentials in. So you can either source from your bash here. There's some directions for doing that here. But what I do that's a little bit easier is I just create a new bash terminal, and then I can say claud. And if you want it to be a little bit easier, I say enable auto mode so it asks me less questions. And then you'll go through and select, you know, whatever you you want here. When it asks you for your API key, say yes. Enter it to continue. Use recommended use recommendation settings. Trust the folder. It'll ask you about an MCP server, which we have here. This is gonna be to talk to, Databricks, and you are gonna say yes. I just say use all here. And then you should get your, cloud terminal. Now if any of those directions, if you selected, like, the wrong option, inside of here, it will tell you how to fix that. So if you need to restart, you can remove from settings. If you pick the wrong MCP thing, you can you can reset project choices here. And then when you're done, you can you can ask this question. You should get zero for this question. And for me, it, it won't be zero because I... What are we doing here? For me, it won't be zero because I already started loading stuff, inside of the... Inside from the workshop. The the other thing here too is we've tested this workshop mostly with Opus, but on older versions of Opus, I might be a little bit of a daredevil here. I will actually... Well, I don't need to open a new a new script for this. What what I'm... I am going to try this with Sonnet. I I was testing with Haiku earlier this morning, and it was working. But I'm gonna try it with Sonnet. And, if it doesn't work, which I think it will, then I will go ahead and switch back to Opus. You know what? I'll stop here and maybe leave some room for questions. We're about twenty five minutes in. Let's see if we have any questions in the chat that we need to answer. I actually think everything here is answered. I think, yeah, Martin, had, graciously answered most of the questions. I think the one that came up a couple times was how long will the API keys be available for people if they want to watch you today and do the workshop at their own time later? We can't keep them around for that long. So I know for the anthropic key, I've gotta shut that off pretty much right when the course ends. I'll I'll let it linger for maybe a little bit after that. Hopefully, you can get, you know, a a cloud subscription. It shouldn't be too expensive for you to just run through the whole course. You're just answering... Having cloud answer a few. different prompts, and it's not doing any entity extraction or anything. Ryan, for the Databricks one, what do you think? Can we keep that alive for a day, or do we wanna shut that off immediately? We're gonna have to shut that off immediately as well. Yeah. So Yeah. But, Okay. there is... If you if you look at the course, there's there's an option to use BigQuery as well as your backing data warehouse. And that one, I leave up all the time because it's it's super cheap. So... And it shouldn't change the way the workshop functions at all. So. you can go ahead and and use the use the BigQuery option. I might need to add the BigQuery key back to the workshop credentials, but I am more than happy to do that. In fact, though, I think it's in the, it's in the environment already. Yeah. It is. So, never mind, I don't need to do that. It's already it's already automatically done for you. Cool. Yeah. And I'll... You'll you'll get an email with this recording from today, and with the materials as well. So you can, you can continue this, anytime, and you can obviously decide how you wanna run it. Watch Zach and Ryan do it and then do it afterwards with the caveat set, obviously. The keys aren't aren't gonna be disabled or you just continue doing it today. And the workshop in itself is obviously forever yours, and you can do it in... At any time, as you like it. Yeah. And then, and there's another question here. You can definitely run this locally. Yeah. It's fine. That's... Exactly. We... Yeah. We we provide we provide this so that it's... You know, everyone has the same playing field and they can all do it. But I I, if if it were me, I'd be running this locally too. Super. Okeydoke. Perfect. So Thank you. how are... Thanks. And then how are we, I don't know if there's a way to get feedback from chat. Is is everyone, like, I don't know. Is there, like, a way. to thumbs up if everyone is, like... If everyone is good on the environment setup or if we need more time? Yeah. Let us know in chat if you're if you're there. Yeah. I I see his thumbs up flying in. A couple of people, lies. Just a little more time, please. A little bit more time. Okay. Let's, Okay. let's, give it give it a bit more time. You... Yeah. Yeah. We'll give it we'll give it a couple more minutes. There's nothing wrong during the waiting period. If you want to move through, just press continue, and it will bring you to to the next piece. So I'll give it a a couple minutes for everyone to catch up, but you're welcome to go through and check things out and start running things yourself as well if you're if you're already there. Sounds good. Cool. I'll just... Let me see if there's anything in chat that we can maybe talk about while people are are getting ready. Yeah. Previous workshops, I shared that. Yeah. No. I think people are either ready or getting getting ready. Okay. Hi. Sorry. There there there was a question from, Max, which is, any comments didn't see. relate to running your valves over this knowledge graph, using one model versus other options? I don't know if you hadn't had had any thoughts on that. So running evals, comparing different models, was that the question? Yeah. Exactly. Yeah. Any... Yeah. Yeah. So for this workshop, I don't have, like, an eval harness set up, but but you can easily do so. And, you know, it's funny because when I first made this workshop, earlier this year, I remember that I was biasing myself towards OPUS and more advanced models. But as the models have gotten better, at least within set of the anthropic universe, I've been able... It seems like I'm able to use smaller models there. So it'd. be it would be an interesting test because, you know, we're... When we provide a knowledge layer, in theory, what we're doing is we're almost like distilling human knowledge for a model, and we're giving it a graph to follow rather than having to do a lot of reasoning and routing on its own. So in theory, the bigger lift should be for the smaller models. And... But that doesn't always happen if the use case is very complicated, and it sometimes, like, and, again, I I think I'm seeing it more the case now that smaller models are doing better. I'm mostly using anthropics, so I'll I'll preface with that. Whereas in the past, it's been complicated enough that you would you would kinda want a bigger model for some of the more, like, for some of the examples that required six or seven hops. But I don't I don't think that's the case anymore. So I would be interested in adding, like, a harness to this... A benchmarking harness and actually really seeing, like, how well, the different models compare. And then, obviously, like, comparing it to, you know, just using BigQuery or Databricks by itself is is always very interesting. And what I find is with... I mean, the whole reason we set this workshop up, right, is because it's it's actually very hard to do this sort of stuff without some sort of semantic layer on ontology relating between the unstructured and the structured data. No. Alrighty. No. Super. I think, we should we should probably go ahead. I think, you know, Yep. if you could maybe catch up with this this one sentence on what you mean with shapes and dimensions. So we talked about, context comes in shapes is, you know, the... So the verbiage that's used with this workshop. And what I mean by that is as AI engineers and I talk about this as if AI engineering is this discipline that's existed for decades. You know? I think as we're... I think... Let me rephrase that. As as all of us are struggling to kinda keep up and learn what's happening with AI, we get very focused on the tools. And this happens with retrieval a lot. Like, oh, I need to do text to SQL, or, oh, I need to do RAG, or, oh, I need to write a Cypher query, a graph query to pull something from the data. But oftentimes, if you take a step back and you think about more like, okay. As... You know, not to personify in a... An LLM, but, like, from the perspective of the LLM, what does it need... What context does it need to see to be able to appropriately answer a user's question or perform some sort of autonomous action? And when you phrase it that way, it's more like what shape of data do I need to give it? Like, what does the view need to look like? And if you think about, like, a a. materialized. view, like like, what does that need to look like? And then work backwards from there as far as what tools and queries you're gonna need to put together. So instead of thinking about it as, like, I need to make a Cypher query to access the data, think about it more like I need to give my AI model a table of contents that it can navigate. Now how do I build that? Is it a Cypher query? Is it a SQL query? Is it something else? Like, how. how do I do that? Right? So that's that's the. idea behind that. Perfect. That makes sense. Thank you very much. Let's, Yep. let's continue. Alrighty. Let's keep going. So we're gonna move on to our first shape, which is this connections shape. And so the idea behind this is how do we be... Explain to the model or to our agent how to navigate our warehouse data? And for this, we're gonna be focused specifically on the structured data side. And there's some metrics that we talk about here in terms of, like, how well text to SQL works and all this sort of stuff. And the the field's constantly changing. Models are evolving. You know, the different vendors put out stuff for for what is effectively text to SQL all the time. But what we're trying to get the AI model to understand is what does the shape of this data look like? What connects to what, and why does it connect to what? And to do this, we're gonna build a semantic layer or an ontology in a sense. And I have a little table here that kinda tries to explain sort of the different levels of thinking when it comes to ontology versus a semantic layer versus a virtual graph. And it's a lot of words, but, basically, an ontology is about interpretation and sort of reasoning through the data. A semantic layer is more about, well, how do I actually query the query the data to match the business terminology so it's a little bit more, like, functional in a sense. And then we have these concepts of virtual graph, which we're not going over today, and that actually, you know, that that would put a graph physically on top, like a a virtual graph on top of a warehouse where you can actually talk to your warehouse with SQL. So it brings it to the... It brings Cypher to the query layer, basically, and then it pushes down into SQL. So it's like you can query your your Databricks warehouse as if it's a graph. We're not gonna go over that today. We're gonna go over a semantic layer today, and we're gonna use this tool called Neocarta. Neocarta is a labs project, and it's something that we're continuously thinking about how to integrate into the rest of our product offerings. A labs project is something that we work on often. These are gonna be open source, and, think of them as a reference architecture, tools that you can use and that you can incorporate into your solutions, but they're not really part of our official product offering, and supported by engineering. And, basically, what Neo Carta does is it sets... You could connect it to your warehouse. In this case, we're using Databricks, but there's BigQuery. I think it works with Postgres and and a whole bunch of others. And you can form this, well, this is not the semantic layer. Where's the semantic layer graph? Or maybe this wasn't here. This is more just showing you how how the querying works. But what I wanna show you is something like this. Right? So it's, your database and how it's schema, all the tables and the references and everything that, basically, like a mapping of your logical or physical data schema that lives inside of a graph, and these reference keys, which are hard to see, but I'll show you after it loads, that tell you how things join together. And these can be inferred by a query log, for example. So a lot of times in data warehouses, you don't have explicitly defined primary and foreign keys. They might come from comments on the tables or they might come from a query log, for example, or some other form of data. And Neo Carta helps you map that over. And then there... There's other things that this can do, specifically around adding... I wonder if it's in here. Yeah. Like adding a business glossary, which we're not gonna do here because we're we're just doing, like, a one zero one example, like business terminology and stuff that you can overlay on top of this schema. So that that can be very, very useful, basically, to get your AI model to understand, like, how all of this works. And, again, here, we're not actually gonna import any data from Databricks into Neo four j. This is all gonna be zero copy. What we're gonna put in Neo four j is this mapping, and then your agent is gonna use that to then write better text to SQL once it understands the shape of the data. Right? And we will continue on. So we're gonna call this Python script here. So I'm gonna just copy it, and I'm gonna go back into my project here. I'll open up a new terminal, and I will type in the command. And I'm being a little bit risky here because I already have the, all the lake house data in my workshop, so I'm gonna be writing it twice. That might screw me up later. But what this will do is... It it looks great. It was idempotent, so so it only load. It it didn't it didn't, it didn't duplicate the data in there. So that's good to know. It's gonna write tables and references into there. And if you if you looked at the way that script works... Let's see. Where is it? It's in load. Builds connections. Basically, what it's going to do, the important part here is where it calls... Get from Neo Carta, and then... Where's the actual... Here's where it instantiates the the Daybreak schema connector, opens up a driver, runs this. But I think, this is just the count. So here is where we do it. So in this library, basically... Make that a little bit bigger. You're you're just saying, hey. In ingest, basically, from Databricks, and then the schema here is, basically reading in, the Databricks schema. So these are the environment variables that we filled in from before. So that's what that's what ran. And then, what you can do to see what it creates inside of Neo four j, I can go back to my workshop. And one thing here too, by the way, it says six tables and five references inside of the catalog. I, screwed things up, for Ryan, and I almost blamed it on Ryan, actually, which was very unfair because I forgot that I screwed things up. I was I was playing around with AI search inside of Databricks, and so there's two tables related to documents that I loaded in which don't belong in there, but they don't affect the course. So you'll see eight tables and five references. But anytime you answer a question for the workshop, pretend that there's only six in there, and we will have to go through and remove them at some point. This... Here's here's the query that's sort of gonna show you what this looks like. So I'm gonna I'm gonna press copy here for this for this bit of Cypher. And I think a lot of you by now know, what Cypher is. Cypher, though, just so... Just for those that are unfamiliar, is our graph query language. It looks like SQL, but it does this, like, pattern matching. What I'm saying here is I'm saying, hey. Give me a path where you're gonna start at a date... At a node labeled Databricks, and then go out on, basically, any type of relationship for, like, as many hops as it takes and get me all the paths. And, basically, here saying return everything that's connected to this database node. I wouldn't do this with a large database, by the way, way, because you can imagine if you have hundreds of thousands of nodes in here, it'll it'll try to pull all of them back. I don't have, like, a return p, like, limit two. Right? In which case, it'll return back just a little tiny piece of it. I'm saying return everything, and it will bring me back the entire connected component. And what we're gonna look at here is we have our database, Databricks. We have our schema, which is our autofix schema. That's a use kit that we're working with. And then you can see here we have our tables. So here's, like, our parts table, our work orders, our procedures, our vehicles, all this cool stuff. And, what these do is these tables then connect to our columns. So these are basically the names of our columns inside of our tables inside of, inside of Databricks. And then we can have sample values in here as well. And then I have highlighted here these reference joins. Maybe I'll make them a pretty color. What about blue? Make them big. Okay. And these are our joins, from primary to foreign key. And there's multiple ways that this can be inferred, by Neo Carta. Obviously, if you have an explicitly named primary foreign key, like, in a in a relational database, it can achieve that. It can also do if there's comments, metadata, like different data warehouses have different ways of doing this. I think Snowflake's comments. I forget what it's called inside of, Databricks, but you... Where you would basically say, like, oh, like, this is a, you know, foreign key to, you know, so and so table. And then it can also do it via a query log. And so that's really important in practice. Right? Because a lot of these data warehouses, as I was saying before, don't have, they they have, like, these implied, join keys, which can be a hassle if you have hundreds of tables. So this example is very, very simple, but I think it's nice for just illustrative purposes to kinda understand how this works. And... I keep going to the wrong thing. There's different things that, different operations. It can get full metadata schema. It can list schemas. It could get context by the table type. You have it. There's an MCP server, that Neo Carta, that's how it's consumed by the agent. There might also be a CLI, I think, in there, but we're we're using the MCP server for this. And, the... We give the agent the ability to run this, this script here, this, run SQL script. So I can go ahead and just copy this and make sure my agent works. Let me actually just start a new plot here, and then I wanna make sure the model is... I'm using SONNET. Cool. Alright. And I will go ahead and ask which vehicles received a certain part. Use the MCP to get the warehouse schema and write the SQL and run it with with the thing here. And it should go away and do that for me. And what it will do is, basically use that MCP server to read the schema from Neo four j, and then it will use that to run the SQL. And while it's working on that... Oh, brought back. So it went ahead and answered our question when on 521 vehicles. And then let me just say what MCP points did you use for this, and it should tell me what it used. Get context by column and get full metadata schema. So it basically went to, you know, that, our Neo Carta graph in Neo four j. It got that. And then I can say, like, what, query did you run-in SQL? And then once it got that, it it ran this other query in SQL. You'd see it looks like it ran too, and it it had a couple of joins in there. So, anyway, that's the that's the basic pattern here. Obviously, this is very simple. Right? Because what we're doing here is, you know, we we have our, our schema is only, like, six tables. So it's not that hard. You know, I I wanted something that's visually easy to see. But you can imagine people will use this. Our customers will use this when they have hundreds of tables, and it helps substantially. And then you can also imagine, which is another area where this is used. If you have data inside of Databricks, then you also have some data maybe inside of BigQuery or something else. It looks like, was someone saying something? Was that you, Alex? Yeah. I was... No. Because, you know, I would... Didn't wanna interrupt. But... Yeah. There there is a couple of repeat questions on where to find the Neo 4JJURI URI and and password from the sandbox. And I think it's in the it's it's in the GraphAcademy course, but it's also in the sandbox. Maybe you could quickly show that one more time. so people know know, where, where to. look. So so, if you're here and this thing is running... Now first of all, when you did this, it should have downloaded a credentials file, and it will be in that downloaded credentials file as well. That's easier. Yep. But if not, you go to... See how there's this thing here? You can go to connection details, and then don't copy my password, please, and screw up my database. But this is this is where it lives. And you can you can copy. the clipboard and then put them in that way. Super. And this might be a good place to stop for questions. Let me just see here. Yeah. There's there's some details in here if you wanted to see around, kind of how things are namespaced inside of Databricks, in terms of the schema and everything. And then you can also... I think this this will just show me some info about... Where's my... I gotta... Yeah. It'll just it'll just show me the dialect that it's using Databricks SQL and Databricks and then the and then the table. Of course, we have the option to use BigQuery here, which if you're. viewing this after, that's probably what you're gonna wanna be doing. You're gonna be wanting to do the the BigQuery version, which will use a a different dialect in that case. For here, say six tables and five joins to continue in the course. Don't say eight because there's two that the docs chunks and the docs something... There's, like, two docs tables in there. They don't belong in there. So it's six and five. And that that will allow you to to move on to, the next part. So this is a good place to stop, Alex, if there's other questions that we have. So let's. Yep. Yeah. We have a couple. One is, a longer one, see. but I think it's interesting because, you know, it it it connects with what you said earlier. This is a small data set. This is a smaller demo size. But Oscar asks, what what if we have millions and millions of registries in in an in an enterprise grade? We have to see millions of nodes, which is the key number of nodes between being optimal for agent querying and not being optimal. Do we have to have layers like memory cache or something like that? So right now with inside of Neo Carta, the the nodes and the the relationships are really referring to columns and tables. So, you know, the... From the deployments that I've seen realistically in enterprises, you're talking hundreds, maybe thousands of tables in really big cases. Is it possible to get to millions of nodes in that representation? I mean, maybe. The way NeoCarta works is it it can do text searches to search in, like, to search parts of the graph. So it doesn't have to pull back the full metadata schema, which would obviously blow the context window. Right? Or or it could. So there's way... So, you know, Neo Carta and the tools that we're developing along those lines, will scale well for larger sizes. In terms of millions of nodes, that would be very large for a semantic layer, although it might be possible. Maybe I'm wrong about that. For other forms of retrieval and memory, for example, you can obviously get to millions of nodes. Like, if you're storing session history. inside of a graph and you're doing entity extraction from that, you can easily get up to, you know, millions to tens of millions to billions of nodes. And in those cases, the way we do retrieval, you can do vector search inside of Neo four j to pick up, particular nodes and then just use that Cypher traversal language that I was talking about before, to go from there. You'll see a little bit of this inside of our next thing about trees and navigation. Like, you can start on particular documents and then do, like, three hops out. Right? And that scales perfectly for larger data. That's that's what we specialize in at Neo four j is, like, good graph reads as your dataset get... Gets larger. Right? So that's all possible. And then, obviously, with things like caching, yeah, like, I I mean, you know, I I would I would imagine that some caching strategy for graph queries would be helpful. There is... Like, we... With inside of the Neo four j implementation, we are... We have our own page cache that you need... There's... If you do, like, the self managed deployment in Aura, we we manage that ourselves. But in the self managed deployment, you could, like, play around with the amount of memory on that and stuff. So hopefully, that answers your question. I don't see it written down, here, and I'm just missing it in the comments, in the in the questions piece. Probably just don't see it, but hopefully, that helps. Hopefully. Yeah. But I'm I'm sure. Cool. Well, I see a bunch of others. I think Martin answered most of these already, so I think we are probably good to continue. Okay. I see a couple more. Maybe I'll I'll take some time, Oh, to answer. yeah. Yeah. It's... The the rest of. the course, by the way, Alex, it's, I... We can we can... As we go through this, we can go faster and faster. But, like, getting that foundation, I think, Yeah. is is. really important. It's it's take. a little bit. more time. here. Yes. Are. there disadvantages on zero copy approach versus copying the data into Neo four j? And that's a really good question. So, right here, didn't see, that. we're. not, Mhmm. yeah, we're not copying the data into Neo four j, and were you doing that semantic layer? And there are disadvantages to that. One of the big disadvantages is going to be on your multi hop, accuracy and, importantly, your latency. So we... I see this sometimes with big, like, supply chain or routing use cases. Like, let's say you wanna find the shortest path between two points. That's an arbitrary length query. If you're like, how do I get, like, a package between, you know, across a country, across multiple warehouses? Like, it could be two warehouses. It could be, like, five stops. It could be no stops. Like, you don't know. And those types of queries just perform better inside of a graph database. And so it makes sense to move your data into the graph database. I think the the biggest question there is, like, is the blocker for you that the query performance and that the the actual mechanisms of the query depend on a graph for performance, is that the blocker? Then moving your data into Neo four j would be smart. If, on the other hand, the issue is really more... Well, like, in theory, I can do this in SQL and it's fine. It's just that my agent doesn't understand how to do it with the current tools that we have inside of my data warehouse or or my SQL or whatever I'm using? That's a different type of question. Because for a lot of these, like, the examples that I was showing you here, right, it was... You know, we were doing, like, what, like, two hop joins or something. It wasn't it wasn't that atrocious. Yeah. Like, two two joins. So it's doable in SQL, but it might be a situation where your agent just doesn't understand it because, like, the business terminology and everything and, like, how things link together might be really complicated because there's maybe too many tables or too much business terminology, and that's when the zero copy approach is really good. So to answer the original question, the disadvantage is really gonna be you don't have the graph query performance. It's really the the short answer. Right? You just have a better semantic understanding and potentially a a better way to structure a query together. Alrighty. Cool. There's a question on from Constantine on, Neo Carta. Does it have HITL or does it generate the semantic model with one shot? Does it have each. I? I don't know what... Yeah. I don't know what HITL means to be honest with you. Human in the loop. l. No. It does. not have a human in the loop. Yes. That could be it. Okay. Yeah. Do you wanna expand on that a little bit, Ryan? Or Yeah. It's it's basically just a a a one shot right now. So NeoParks basically reads reads the metadata, builds the semantic layer. And you can do a manually view, but there's not, like, an iterative process for that loading of the metadata right now. We are definitely expanding on that to add, you know, a, you know, a human load process, but that's kind of a future roadmap item. Alright. Awesome. Okay. Cool. Great. Thank you. Let's go ahead and move on to our navigation piece here really quick. So now we're moving on to a different shape, and we're gonna be talking about a table of contents and navigation. So I call this a couple different things. Sometimes I call it outline. Sometimes you'll hear me call it trees. Other times you'll hear me call it a table of contents. And I apologize for that. The the words have been jumbled as I've moved across different projects. It's all the same thing though. The idea here is that sometimes when... And we're gonna be moving out of the structured data world and we're gonna start to talk about our... The document side of the database. These are gonna be the PDF documents. And our natural inclination right now is to do vector search and chunking on PDF documents, and that's great, and we can keep doing that. But a lot of questions might involve more navigating those documents. And the idea here is that we want to give our agent a table of contents where it can navigate. So just like a human, if you open a book and you look at a table of contents, how do I jump from, you know, one section to another section, and how do I know what contains what? We wanna give our agent that exact same view so that instead of just doing, like, a control f, it actually goes through and understands structure that it's looking at in terms of the library of PDFs and going to the right thing. And this is this is the view or the shape that I wanna give my my agent. Basically, here's the technical library. There's bulletins, and there's gonna be recalls and manuals and stuff also. And then you're going to have documents, and those documents are gonna contain different sections, and those might link to other sections. So this this... So this basically means, hey. This section on this condition of this Falcon two point o t cylinder misfire thing links to a misfire diagnosis that's inside of our manuals on the Falcon engine. And they have these URIs here, they're kinda long, that help identify down to the document, but they're hierarchical. Right? So the... So, like, I have the technical library, my bulletins, and then a document would be, like, that whole URI technical library bulletin and then PDF. And then a section, you can see here, would be like these... You know, you have a hash symbol and then the the section. So I can... I have this big containment view. And that's helpful because it it allows my agent to do more of an exhaustive search where it understands everything. This is what the graph data model would look like together. Right? So you have your containment relationships and sort of these has relationships. So you start out at the folder level, then you go down to the document, And then you... We do have next section relationships as well. So there's a sense of ordering, which is gonna be important for a table of contents, right, because when we have multiple entries, we don't want them to be random. We want them to almost be, like, paged. So you would like... If there was, you know, a diagnostics section after condition or, in this case, a cause section after condition, it's it's ordered, in the way the document has it, and then the links to relationships, which are super important. And what we're gonna do with this, is, basically, we're gonna load it directly into Neo four j using this script. And the great thing is... Let me run it while I talk to you about it. And, actually, I'm not gonna physically run it. I'm pretty sure it's idempotent. So if you run it... Idempotent means if I run it twice, I'm not gonna duplicate it in my data. I'm gonna skip running it though just in case, I'm wrong and I made an error making the script and it actually isn't idempotent. But this process has the capability to be completely idempotent, meaning once you load it. So go ahead and run run this yourself. And, basically, when you run it, it'll create all of those document nodes from from the PDF docs. We actually have a copy of them here, I think. Where would they be? They'd be under corpus. So we loaded them into cloud storage, I believe. If not, then they're just pulling from here. But it's... You know, whether or not you load from cloud storage, you load from local is pretty trivial. These are actually the... Not the PDF. These are not the PDF ones. These are the markdown ones, but we also should have in here the... Would be under would be under docs. Give me one second here. And if I can't find it, I'll just look at the markdown ones. Sources. PDFs. Here they are. This is what a... Oh, it's gonna show me in in a in a gobbled up view. That's no fun. Do I have it pulled? I don't. Well, they're PDF documents. If you look at the markdowns, you know, the... It's just a PDF of the same markdown here. So that's that's what they look like. And so what that script does is it goes through and it says, okay. Like, I have the different sections, and it just has a deterministic parser that knows where the sections are. These links are, you know, they're not they're not structured like normal URL links. You can you can easily make the code so you structure it like normal URL links. But they they refer to other documents here, and it will deterministically parse those into other nodes. And what that what that looks like, once it's done loading, I can go down here, and I'm gonna copy another piece of my Cypher and go back to my window here. And I'm gonna say, hey. Like, go to the, library, root node, basically, which is at... The library is like the top of... It's a root node of this whole thing, and go down, four... Zero to four hops down, and I'm gonna limit it to 50 because there's actually a lot of nodes here, and I wanna pull everything back. And then I can even select... If I go down here and I go to hierarchical layout, it will lay it out hierarchically. So you can see I have my folder. There's actually three folders here, right, because we have the, the bulletins, which it which it went down, but then there's also manuals and recalls. And then you can see the documents and then all of the sections and the contents of that section, underneath that. You know, and then the the has relationships and highlight them in orange. So those are the has relationships. And then there's also these links to relationships that we have, which you can highlight here in pink, and those go to different documents. And then, like, I can, you know, go to these documents and expand out and create this cool, like, you know, interconnected graph thing where I can start to understand how everything, connects, which is all really nice. And so one thing this is kind of related to too... Some of you are probably familiar with that whole Caparthy, like, LLM Wiki thing where you have, like, documents and markdown, and you have your your Wiki where you have the LLM, like, extract your research into entities and, concept pages. This same process can be used to deterministically load that type of Wiki into into a graph. And I like this to start because we don't do... There's no entity extraction here, which is great. Like, I might, at a certain point, want to say, hey. Like, I actually want to extract parts and problems and concepts from these documents inside of my graph further. And instead of just having, you know, these, like, folder document sections, subsection, like, you know, nodes. I'd have, you know, part node and and person node and all this, and that's cool. But the great thing about this is it's deterministic. You can get started running it immediately. It's it's all copacetic. It works great, and then you're you're sort of off to the races with your with your knowledge layer, which is why I like this example. But, anyway, what what we do once we have that... Over this page here. Is there's, a spec that we have around the outline format, by the way, that just that just describes kinda how how everything works. But I'll get into that a little bit here in the next section why why I mentioned that and why it's important. One of the things that we do in this workshop or we'll do for the next forty minutes, however long I have you here, is we're gonna start to use, the Neo four j CLI. The Neo four j CLI is this thing here. So I know I'm I'm gonna be sort of showing a lot to you, but anyone that's done text decipher two years ago with Neo four j and was, like, frustrated by how shitty... Oh, sorry. How bad it was, which is normal. Things are getting a lot better now, with better models, but also because we're creating tooling that gives you the ability to, have a a CLI where the agent can actually run Cypher commands very easily, even spin up infrastructure for you. But really importantly, it can also install these Neo four j skills, which we keep updated. And, these skills tell your agent how to do, like, work with all of our drivers, work with graph data science, work with, MCP, and write Cypher, the query language, which means that if you're using this, your your agent can write really good cipher. So instead of... And and the idea here is, like, I wanna build that shape that I was talking about earlier. So I wanna build the, where is the picture of it? Well, I wanna build that outline shape, that table of content shape. And how do I get my agent to do that without me knowing how to write what is actually not gonna be trivial cipher? So if we if we... I'll copy this because this is going to be our, our command that we're gonna give our agent to do to basically build that for us in real time. And... I have all this open. Let me close some of this off. So if we go into our skill, we have a whole skill here that's gonna help the agent basically do everything for us, a little bit down the road in the workshop. But there's our actual outline, script. And you see here we have this wire where... And this is gonna happen to you a lot where you're gonna kinda know, like, like, what you want to write. Like, you're gonna have basically, like, a spec for how to build the query, but you're not gonna know how to do, like, specific parts of the query. So what we have in here is a spec that's, like, telling the agent, like, this is kinda how I think I wanna put it together. And what we can then go and do is I can ask my agent that question of... I'm saying, hey. Use the Neo four j Cypher skill. I have another spec in docs outline format and this build spec here. So the spec in doc outlines format is here. This explains the format that I want it to produce. Yes. Maybe I didn't start this with the auto thingy. So this this this document explains how I wanna put everything together for the agent. See? It's nice and pretty. And so this this pattern, I just wanted to have it in the workshop so you can see. Oh, did it finish already? No. It should still be working. Let's see what just happened here. Okay. And in case this doesn't work too... So it it already it already filled in the, the query. So if I go to outlines, you see here it it already, apparently put the query in. Although, I'm a a little... I just wanna make sure of one thing here before I move on too far. Nope. Oh, don't do this. Yeah. It didn't modify it. Yep. So you can see here it, went ahead and it it put in basically the rest of the query that I needed. So, anyway, this pattern is useful because it'll it'll help you, in your adventures with writing things when you don't know how to use Cypher. There is, inside of here too, a solutions folder, which I told it not to look at. So if it's getting it wrong, you can just copy from the solutions, if you if you get a little bit lost there, if you don't wanna wait for your model to, to get through it all. And then... But then, basically, once once that's done... Get rid of the skip thing. I can... I'm gonna open a new window. I can go ahead now and start running my my outline script. So I'm gonna go ahead and copy that. Go back in here. And this is gonna return the whole outline, so it's gonna take a while. It's gonna be huge. See? So it, like, returned the whole thing, and it's not really very useful. But what you can do with this is you can say, hey. Go down to depth one or depth two or whatever. And then when you do that, it'll... The agent can use that. And then I can do, like, hey. Go down too deep. And then it will... Instead of just doing the high level ones, it'll give you, under each one, like, all the all the pages. And then the other cool thing that I can do is I can be, like... I can take one of these, so say that one, and then I can go, oh, do do it for... Then I think I just put it at the end. Yeah. So... And then it'll give me just for just for that one document, what are the... See, just for this ridgeline, whatever thing, what are the different sections and the things that it links to? And then I'm like, oh, it links to this. Let me go check out that page. Right? So then I can be like, oh, I can go here, and then I can check out that. So you can see how this might be useful for an agent over just vector search because you can sort of, like, traverse through these documents in an intuitive way. And it's a little bit hard to see, but if I make it smaller, you'll be able to see. And then I can I can have the agent kinda loop through and get all these different connections? So that's that's really nifty in the sense that, the agent that's actually consuming this doesn't need to understand Cypher. It just needs to understand what a table of contents looks like, which, you know, a lot of agents already know how to do because it's it's a pretty easy human task. Alright. Let me let me see what's next in this guy here. There's also a search query. So I don't have vector search in here, but I do have full text search. And so the same pattern that we did before with, what I was showing you for outline, we're gonna do with full text search. And that's going to allow it to search the titles and the contents of each PDF document and section. So I can go back to the cloud session that I had, and I can say, hey. Use the Neo four j Cypher skill, and then I have a spec contract inside of search. In this case, I don't have a whole, like, document around it like I did for outline because it's a little bit simpler. I can have it go and do that. The, the spec documents... Let's see. It made its little change there. Site of skills. I can go and look at search. And then, I did have this built from spec, and, yes, you can make the change. And then once it makes that change, this will hopefully pop up with a change here really quick. Yep. Alright. So it went and did that, and then I don't know why it's not updating here. But if I were to open it again, maybe... But it... Basically, what it it... Why are you not... Hold on here. Maybe I just don't know how to use, it might just be because it's a Simulink reference. It did it did update in the search document. Same pattern. I gave it a spec. It went ahead and, updated it. It did update it in the Cypher here. I'm just an idiot, and I don't know how to read. So you can see it updated here, where it it basically is using, a full text search, here. And then it's also doing this other cool thing, which I'll show you in a second. Basically, you can do a full text search, and then, I can I can ask for, like, top k documents? So if I go back, to my window here... And someone yell at me in the comments or something if this is too hard to see. I'll... I promise I'll try to read it. So I can go and it will give me a my top documents that are searched with that URI. These are actually sections. And, you know, I can expand top k to be bigger, like 10, and then it will give me 10. That time... The time before was four. And then the other thing that I can do here is I can say, well, do it... Do a search, but do the search under somewhere inside of this library. So the whole library is hierarchical because it's all these containment relationships. Right? So one thing that might be useful is I just wanna restrict my search to being underneath, recalls. So I say under recalls, and then it will only give me documents that are under the the recall, under the recall subsection of the library. And you can do that with any URI. And, again, I don't use vector search mainly not because I don't like vector search, but just because vector... Each vector is different and each embedding provider, like, they're they're not compatible. So to make this easy to use, I just didn't do vector search. You can easily put it in here, and it would it would work fine just from an interoperability perspective so I don't have to deal with... You know, some people wanna use open source models. Some people wanna use Gemini. Some people wanna use OpenAI. Some people wanna use Anthropic, and then you end up, like, needing to, like, make up, you know, an option for for each different key. So this is easy because, you know, it's just it's just text search. And then for check your understanding, it's the first... Or I guess it's one eighty three and nine eighty five documents. So to do this question, which is... It's basically if you were doing this by yourself, it's a learning question to help you move on to the next step. You go back to your... Let me move this over here so I'm still getting confused with that. You go back to here and, you say, I count the number of documents and sections I have. Just to double check, one eighty three nine eighty five, and that is the same number, that we have here. So just this quick sanity check. And I think for this one, these next parts, I think, are fine to skip, actually, because a lot of this is, just sort of walking through kinda how the Cypher works internally, and then there's some optional library practice. So these two sections here, navigating the shape and optional library practice, are fine to skip for now. Maybe what I'll do here is I'll stop, and I'll see if... We'll take a little bit of a break because I feel like I've been talking about a lot of different things. We'll see if we have any other questions, and kinda do a pulse check of where everyone's at in the room. Super. Sounds, good. Let's, let's hear it in chat. Let us know if you're struggling with something, if if you're, up to date with where we are or if if you need a little, repetition of some some of the exercises. How long is the break? Well, a a a few minutes, maybe. We'll try to get to a couple of, of questions. Couple questions. Yeah. I... Yeah. I can go go for it. And, yeah, let us know, if you are in in... Not not not kept up with what, what ZEC went through. There is one question, that I see we could we could probably talk about, that came in a little earlier, and that was, do we only need to document structure nodes, and no domain concept nodes? So... So here... Yeah. So I. I was talking about this a little bit initially. There's... Mhmm. To start, I'm not doing domain concept nodes. That was an explicit decision by me for two reasons. One of them is it's easy to do what I'm doing right now. So for people getting started with a knowledge layer, this step is is simple, and it gets you off and running very quickly. The second piece is that for the type of example we're looking at, an an AI agent to a great degree already has the ability to infer entities and concepts that exist inside of your documentation. And so if you have a way for the agent to navigate that documentation and search it effectively, then in theory, it can do a fair amount of the work without explicit entities. Of course, where that starts to break down is, hey. I'm now... You know, I now have a huge amount of data. And one of the interesting things in this graph is we actually have two disconnected graphs. So we have, like, a semantic layer graph and a document graph. If I was to go and actually look at what this look like... What's a good query for this? Let's just match p equals... I'm gonna I'm gonna bring back all the data. How about that? So once I can get my cipher right and then return everything and fix my spelling. This won't this won't crash. Return my whole graph and do it in a force layout. So see see what this graph looks like right now? We have, and it... It's still limited the amount of documents that it returned, I think. Here's my document graph, and then here's my... On the bottom here, here's my semantic layer ontology graph. There's no relationships between the two. I'm letting my agent infer the relationships between them. Where extracting domain concepts would help a lot is if I wanted to link between these two graphs, which at a certain point is probably smart to do. As I get more and more data and I get, like... You know, you think about it, like, if if I was getting really technical inside of, like, different, you know, like, car specs and engineering knowledge, I might not wanna rely on my agent's general understanding and pretraining to do that. I'm gonna I'm gonna want relationships here. So those domain concepts will be helpful as you get more data and as the domain knowledge gets more specialized to connect and resolve these together. At the scale that I'm working with, this, I can I can get away with, and I can have my agent kind of infer the connections between? So, yeah, long answer, but, hopefully, it's helpful. Cool. Thank, you. Should we... Yeah. You you. say? Well, we can do one or two more questions, and then I think we should move on. Okay. I think most of these go a little bit down different paths. So let me see if there's something that is more closer to what we, have here. There's one question on, is there a way to document and view the data model or the knowledge layer? I think what you just showed, probably. Yeah. I mean, so we have the view in browser here. You can call the schema dot visualize here. Why is this telling me that I'm wrong? Visualization. That's why I spelled it wrong. And you can you can look at what your data model looks like. So you can see again we have the... Here is the the Neo Carta data model. Here is my document data model in the database. Also, with inside of the Neo four j CLI, I'll just jump ahead and I'll I'll show it to you really quick. You can do stuff like this where I can I can actually call for the schema? So go back to my thing here. Say, hey. You can bring me back the schema, and it'll tell me, here's my constraints, so, like, unique IDs. I'm zooming out just so it it renders well inside of the... Inside of my terminal, but you can write this out to JSON too. And then I have my indexes. I have my relationship paths, all this sort of stuff, and my nodes. So there's different ways to to pull these schemas and visualize them, if that's the question. Okay. Cool. Let's save the others for later so that we at least have time to complete what we want to show in this workshop. Alright. Awesome. So, I'm gonna move on to the next shape now, and this is gonna be the theme shaped, which, might be one of my favorite shapes. Not that I have a favorite, but I kind of like it because it uses graph data science, and I used to be... Was our first graph data science technical marketing person. So I just... I like it when I get to when I get to touch graph data science. I'm gonna pull back, another view of the graph here, which I'm gonna say, get me all of the links to relationships. This is when a document links to another document. And the interesting thing is when you look at this graph, once it comes up, because I'm pulling back a thousand things, it might take it a little while here, you'll start to see different clusters will form in the graph. So, like, you've got, like, this thing over here, right, which seems to be centered around this ABS stuff, and sensors. Right? And then you'll have, like, other stuff over here, control module... What's this guy? Communication control module again on this node. So you start to understand that as you as you aggregate more and more data, the links between your documents are going to start hinting at deeper underlying patterns. I think that's pretty simple. I think we understand that kind of from a graph perspective. So what we what we wanna do is find a way to understand what these clusters mean. And, like, importantly for... You know, you can imagine... And this this more goes towards, like... Imagine you're, like, a VP of Auto Fix or something, or you're making a report for senior leadership and you're like, what are, like, the big things that we're documenting? How do those things relate to what's actually going on in the field and what's being fixed on the line? And, like, is there a place where we're missing documentation? How do we sort of do? Or even if it's like a customer segmentation question, you can imagine there's all uses for this type of clustering. We we wanna find a way to do that. And what we wanna be able to do is find an easy way to give our... This is gonna be hard to view because of how this window is is rendering this, but, basically, I wanna create these themes where I can name themes inside of the graph. So here, what I'm doing is I'm I'm gonna say, well, if I have all these documents, how can I group them into these groups? And the names, instead of doing something again, we can do this this thing where we, like, use an AI model to create this domain specific name that it infers from every group. What we're going to do here is instead just say what are the top shared target documents and most linked documents inside of each of these clusters that we identify. And that, in a sense, will kind of give us an inferred name because, like, we'll get, you know, these, like, communication stuff of... In this one. We'll We'll get another one about break stuff, and then we'll get another one that's, like, all about, like, pressure sensors. Like, those are the documents being referred to. And so even without, like, having a very fancy process that, like, does this sentiment naming thing, just using the documents themselves, we can kind of infer a lot, by creating this shape again for our agent to look at. And, we're gonna do this with, with a with a graph algorithm called Leiden, and we have a way inside of that graph algorithm to say, like, how tightly interlinked these different, communities or themes are gonna be. And it's a... It's con... It's conduct... Conduits. I always say conductance, but I think it's, where is it? I pronounce it here somewhere. Yeah. Conductance, which is basically, it's it's a measure of, like, how... It's like how many or how many links are in between the clusters versus inside a cluster or a theme. And we can use that to measure kind of, you know, how well the the algorithm did or how naturally the graph clusters, just to start with. So we have a themes format markdown document. So in the same agentic coding spirit, inside of here... I'll make this bigger again. We have our theme format document. And where we describe the shape that we want, we describe the types of things that we want on our headers, the number of documents, the number of groups and themes, shared cross references, how we want to define cohesion, like, by tightly, moderate, or loosely interlinked, top shared targets, most linked stuffs. The algorithm itself will produce theme IDs for every node. That's how the community detect... Detection algorithm works. And I'll show you what the query actually looks like once our AI model effectively helps us write it. So there it is. And then the scripts file, in the same sense, we have our sort of spec. Right? Build from spec. We'll see commands in here like GDS graph project and some of some of this stuff. The lighting calls, we make, I think... What are we doing from spec? I think the the the hint here is, like, how do we, create the the graph projection, basically. And we're actually gonna provide a little bit more guidance around here's how we call the Leiden algorithm, and the conduct... The conductance metric... Con... Conductance. Gosh. The conductance metric. I said it right the first time. And then, basically, what we're doing here is we're going to be doing this Leiden algorithm that will say, hey. How can I cluster the nodes based on these links? And then we're gonna write that to the graph. That's what a lot of this is. And then some of these queries are... Is just logic on how do we pull that back out of the graph again to create the view. And I recall why we have the spec here now that I was just talking about it. What we actually want to do here is... Because links are between sections. So when I had this graph up, not this one, when I had this up before, if I look at the types of notes here, there's sections. We actually wanna aggregate this, I think, to the document level. In that way, it's... It just creates a cleaner graph, and then we want it to be a bipartite graph... Or not a bipartite, an undirected graph. Or no. Do we want it to be undirected? Now I'm talking too much. Links to target collapse both ends to their owning documents, so we collapse it up to the document level so that we're not... Because, otherwise, we would have documents with multiple sections that link to something, and it... It's it becomes a lot cleaner if we basically aggregate the graph up to documents and look at just links between documents. And then we do, yes, undirected types. So we do do the we do do the projection undirected, which just basically means that when two... When one document links to another, it's it's sort of like a bidirectional link. It it helps the Leiden algorithm run more effectively the way that it's effectively the way that it's supposed to instead of having a directed relationship. We're basically saying if document a links to document b, then document b is, like, just as related to document a as document a is related to document b. It's not like document a is related to document b and document b isn't related to a. So I will leave it there. I probably said too much about that because I don't wanna make this a course in, like, graph projections and undirected graphs versus directed graphs. It's probably going a little bit too deep. But if there's a question on it, we... I can elaborate on it a little bit more. So if I continue on here, what I'm going to do is do the wire here. So go back into my agent, and I'm gonna ask it to create this again. Now if you notice here, what I'm doing is I'm saying, hey. Use a cyber skill, but also use the graph data science or GDS skill. That's in charge of running that light in algorithm and doing those projections. And you see it just did the projection here, and it was able to do that document aggregation. It just matched the sections to the documents and then did this, like, URI split thing. Yes. I'll let it run here for a second, and I'll go through and copy, basically, what it now will look like to run this themes query. So it looks like it did that well. And if that works, then we can go to our bash script here or bash terminal rather, and we can run themes. And then it will bring it back, and we'll get our view here. So now we see these are the basically themes, 13 themes throughout our documents. We have our... So that is BCM and communication stuff. Break stuff is t two. Theme three or t three, pressure sensor, pressure sensor stuff. Here's the documents that are involved, and you just keep going down, ignition coils, catalytic converter, oxygen sensors. So if you know a little bit about cars, this stuff should be making sense why it's grouped together in... Inside of the same, inside of the same groups. So we get to understand the themes inside of our documents. And then what we can do with that, we can also turn the... So I'm not gonna run this. I mean, I can. There's a gamma parameter that controls granularity, and you could turn up the granularity. It's not gonna make a huge difference inside of this, dataset. But, basically, if I turned gamma up to two, I think one is the default, it'll give me more communities if I do that. And that might be useful, like, you know, sometimes, you know, you wanna tune these algorithms. Yeah. It... So it gave me 14 themes instead of 13. So it's not a huge difference here. But there's there's ways to basically tune these algorithms. This question, I actually think I need to go back, to our GraphAcademy people and fix this. Every document should have a unique theme ID, I believe. If that's not the case, then I might have to go back and fix it. But the way that you answer this question to move on, you just say most documents carry a theme ID grouped into two or more themes. I think the rule is actually supposed to be that each theme has a unique... Each document has a unique theme ID, but it may also not have a theme ID. So there... There's, and... Oh, no. Wait. Now I understand the question. Okay. I'm get... I'm getting my one to many and many to one, things confused. Forget everything I'm saying. Theme IDs are gonna be community IDs. So there's 13 community IDs. Each document will have a single theme ID, and... Or they might have a null theme ID if they weren't able to be put into a group. That is the correct answer to this question. A is what you would say to move on, to the next piece here. And, what happens next? There's some cool questions you can try from here. So, like, where are issues concentrated, for example? I can go into my, agent view here, and I can ask it this question about, like, hey. Where are issues concentrated? Sometimes with some of these smaller models, I have to give it a reminder to use the auto fix skill, or else it'll go and it will, like, try to... It'll think you're talking about, like, GitHub issues or something. And it it will know to use the themes here to to work that out. And it will look at, like... It'll basically do this process of, like, oh, let me, you know, go look at the different themes and then, you know, get everything, you know, concentrated and then look at, you know, how they connect to everything else, inside of the warehouse. So then it will fire up, like, the warehouse piece. Just look at the work orders, which it's doing now. So that's that's kinda cool to see. We'll ask more questions along these lines as we get, deeper into the course. And so it... It's able to find, like, you know, the original question is where are issues concentrated? Concentrate in the ignition coil and misfire repairs. That's for the comebacks, and the volume doesn't concentrate anywhere in particular because the 15 troubleshooting codes I pull each have about 300 workers... Work orders. So I ran this by looking at the themes and then going back to the warehouse and doing a SQL query to pull back, like, the different codes and stuff that fit into those themes. So kinda cool, the way it's the way it's able to connect those two pieces of data together. And then from there, I'll stop here really quickly because I think, again, for these for these next ones, it's gonna be going into Cypher a lot, and I don't wanna really do that given the amount of time we have in this course. It's sort of optional practice. So I'll stop here very quickly. We'll take a couple minutes for questions, and then we'll move on to our next two lessons. The one lesson is gonna be really short, like five minutes, and then we'll spend the majority of our time on that last lesson. Sounds good. Thank you, Zach. There is one question, that came up or a theme rather that came up a couple times is, what would be the challenges for adopting the workflow that we... We've implemented here or shown here today in a different context such as, you know, telco or supply chain or in any other other use case? But would that be... You know, how would that work, if you have a different, I'd say that scenario? everything that we're doing here, if you actually look at our schema, it's it's a... It's not a use case specific schema. Right? Like, look at how these nodes are labeled. We have documents and libraries and sections, and then we have, the, like, schema stuff. So this could... If you just looked at this schema, this could be for telco or supply chain or fin serve or anything. Right? So it... This can be a starter for just about any use case. Now that being said, you know, your data kinda needs to be in a certain spot for this to make sense right out of the box. Like, you need documents that are somewhat well structured for, you know, this hierarchy of documents and links to to be able to fire correctly. And, likewise, you kinda need, like, a data warehouse or something or some sort of relational database for this to work. You know, putting your data into that format may or may not be challenging depending on where you're coming from. But the great thing about this is that most projects will start out with some form of structured and or unstructured data. And if you can start with something close to here and augment it, like, for telco or supply chain, it might be necessary to, like, have other elements that sound like in a supply chain. You might have to do some structured data import, same with, like, telco. Like, you might want a digital twin of your power grid in there at some point. But this is sort of like your... Think of this as almost like your your foundation starter type of ingredients that you can then build on on Unmend, and maybe you take half of the schema and use it or 70% of it, and then you you try to, you know, fit in some of your other pieces. So hopefully, that makes sense. Yep. Cool. And. maybe one more. one more. Yeah. Yeah. There's another. Is... Whether the semantic layer is meant for managing documents or for managing data in a data mesh. For example, on top of data data product endpoints and then, you know, how how should the edge... Agents basically consume the data through through these API endpoints or through a direct graph, connection? So that's a good question. So if I understand it correctly, the the question is not like, well, I don't really wanna access the data through SQL. I wanna access it through some other microservice or, like, endpoints Yeah. because the the data is exposed differently through an API. So, Ryan, I don't know. Do we have anything in Neo Carta yet that does, like, a mapping to a data mesh or API endpoints or, like... I know we have virtual graph for some, like, Microsoft products, but I don't. know if don't familiar with anything. know. Not that I know of. We we have an MCP server which agents can use, and that's a difficult pattern I've seen. But... Yeah. But not like a data mesh, which would would actually be a great addition. Yeah. Yeah. So I don't think we have that yet, but it would be an interesting idea if you, you know... Yeah. I would love to see something like that, and I... And, you know, it's... We think about these things quite frequently, but that... Yeah. That would be a great addition. I don't think we have it here yet, though. Sounds good. Alright. Alrighty. Thank you. Cool. Alright. We only have twenty minutes left. So let's see if I keep us honest about being able to get through everything. The next section, I'm not gonna spend a lot of time on because we already talked a little bit about it, and it's about our Neo four j CLI that we're using. So this CLI, I already went over the shell here. It's very easy to install. It won't just work with, with cloud either. You can use it for codecs and and for a ton of different types of agent harnesses. You start with the bash script, and it will auto sense the the harness that you use. I think at some point down here, it'll say, all the different, clients it works with, maybe in quick start. Well, it's in... Somewhere in this documentation, it will say, all the different agent harnesses it works with. But it's quite a diff... It's quite a few. It's pretty much all of them. And that allows you to run Cypher directly inside of the shell. So, for example, when I was back on my thing here, I can write my Cypher queries in the shell and get results back. So quick Cypher query, and then it will give me results back. I can format that to JSON or or however, as well. And then, it will also allow me to get schema information like we showed before. And, what's great about this is that it... The agent can now access this client. And in addition to accessing this CLI and understanding how to use the skill, it can also do things like, you know, spin up infrastructure for you. So if you're... You can manage Aura, for example, from the CLI. You can add databases, get information about them, spin them down and up. Then the other thing that's really important was what I was talking about earlier, which is getting these skills. So that spec driven development that I was showing you before was through that Neo four j CLI and that skill bundle that it installed. If I go there again, right, it's all of these skills. So if you look at, for example, the GDS skill, you get these, you know, skill MD files that tell the agent how to use it, what to check for. It'll have references to all the latest and greatest. So instead of your agent using, like, three year old Cypher from some, you know, I don't know, from some, you know, Stack Overflow, you know, thread that it scraped from, like, 2021 or something, it'll use all of our new Cypher, and and everything you need to to run really effectively. So I highly recommend if you're doing any form of agent decoding, to check out the Neo four j client because we're using it here and it helps you, use Neo four j very, very quickly. That is all I want to say given the amount of time that we have on the Neo four j CLI. And so the last thing that we'll do is start putting this together into some more complicated questions. So, if you sort of move through the course to this last lesson, if we... Some of these questions that we're asking... And we saw it a little bit in what I had put earlier, is, like, if we ask about, you know, like, you know, what fixes, a certain issue on a car, it's gonna look at documentations, and then it's gonna need to look at candidate parts. And these two things live in different sides of our data. One of them lives in our documents, and then the other one lives on the warehouse and the structured data side. And then it needs to return that at... You know, the answer to that question with with evidence. And so what we're attempting to do here is basically keep this process honest, and we've developed a whole skill inside of the workshop here, if I go to the skill, to do that. So you can see, there's certain things that I... That I'm saying don't go to because just for the sake of the course, like, don't look at our solutions, right, to answer questions. Describes the graph, describes the outline, the search tool, and the themes tool, you know, how to basically use, read different aspects of the database, the sort of shapes first mentality that we're using, some examples or exemplars of things that it needs to, that it needs to think about, like, a certain types of questions and how to answer them. And then, basically, some common sense stuff, like grounding your answers, using evidence, all this all this kind of stuff. And it has those outlined in the search and the themes, from before. And so we can go ahead, and if we go to continue... Yes. Continue. We can start asking these questions and having it traverse both sides together. So the first one is for a VIN... And let me just plug it in and have it because it... Sometimes it takes it a minute here to to answer. So while it's spinning, we'll talk about the question that's being asked. So here I say, hey. For this VIN number with a certain code, what was the fix on similar vehicles? So to get this information, it's referring to something in the database, and then it's gonna have to look at fixes for similar vehicles. And then you're gonna have to explain the steps and the shapes that you use, and I'm telling it not to use the Neo four j CLI mainly because, sometimes it'll try to sidestep our procedures, like our search and themes and outline procedure and just use the Neo four j cloud by itself. It already returned a response. And what I like to do is just look at sort of the steps that it used. So in this case, it searched for the issue inside of our documents. It used the warehouse shape to look up the vehicle stuff. It filtered to a specific code, and then it did a second search under this bolt to confirm the suppression and repair procedure, for... There's there's one part that basically, like, superseded another part. I think it was, like, faulty or or retired it or something. It's like the I c twenty forty two b comes after I C2042 a. Sonnet is going really fast today, which is nice. Normally, I'm used to this taking a little bit longer when I use, Opus. So, anyway, it went through and it basically searched both sides of the graph with that, our knowledge layer. We can ask more complicated questions too. Like, for example, here, this sort of estate is proving a negative. And in this case, what we're asking... So it's more of, like, a higher level question that someone making a report, not necessarily someone working on the, on the floor of, you know, like, a mechanic might ask. But this is, are there mismatches between our documented procedures and the actual problems in the field? What documentation is missing? And what documentation isn't being used? So that's that's an interesting question that if you're, like, you know, thinking about this from a management perspective, Do we have all the documentation we need? Are we running our, you know, business effectively, basically? And this one might take a little bit longer to run. But while it does that, what I'll do is I'll go over and... Because we only have ten minutes left, and I don't wanna, like, take forever with the with the workshop. Is here's here's another type of question that might be interesting, which is similar to what we were looking at before, which is what are the common patterns across our bulletins and recalls, and how many of our cars are affected by these patterns. And bulletins and recalls, right, are, like, issues with cars, with vehicles. So this is a this is a question of saying, like, well, what are the issues and how many of the repair orders that we get in are actually having these issues? And break it out into common themes so it's not like every single issue by itself. So what I'll do here is maybe I'll just go into this next pass... Bash bash, terminal here, and I'll enable auto mode with an extra dash there, and I will go ahead and ask this question. We're we're also on... Let me just check that we're on SONNET, and we'll go ahead and get that question spinning. So some of these questions, because they're more complicated, they're just gonna take longer, and that's fine. I mean, I I... We expected this... I expected this to begin with. So if it takes a few minutes for these to return, that's totally fine. But what's going on here is it's doing more exhaustive searching, and it's going between the two sides of our graph to be able to to be able to find these responses. Alternate. Well, that... It might take a minute here to run. So let me see if there's something else we can talk about in the meantime. Because we're right about at the end of the at the end of the workshop. The right fix for this, it actually came back on our first one. We were looking at it in the responses, this revised coil, ignition coil, that it's supposed to use to to fix this issue. That's our answer to our first question, by the way. So it's b here for this one. Proving a negative. I believe these are... We're waiting on these to come back here. Actually, one of them came back. So this was the question about, are there mismatches between our documents and procedures and actual problems in the field, and what documentation is missing? So here, what it did was, it went to the warehouse, and it ran some SQL, basically, to enumerate all the codes. And then in here, it chose to do a search with search dot py, and it has some limitations here which are interesting, because I really wanted it to actually use the outline dot py. If you look here, it can enumerate codes that appear in documents but not in the warehouse. This search can't list an outline dot py, share document titles, not codes inside. So here's an interesting example of where, like, I really wanted it to use outline dot py to connect documents together to what was in our work orders, and it didn't here because the document codes weren't part of the title of the documents. So to those people asking, like, well, when should I extract nodes from my, documents, this would be a really great place to do it. Right? Because then you would have the ability to navigate the connections between, in this case, your specific parts instead of just using search, which is really what I intended. But you can see here how some of the formatting of the data is really important. And it's still able to do this by looking at the data warehouse and then performing the search. Outline would have been better because instead of doing an exhaustive search, it would have been able to have basically jump between all the documents and links, and it would have made this return much faster. But you can see, basically, the answer that it gave here. There are mismatches in both directions. The clearest one is the two high volume troubleshoot codes that the library doesn't mention at all, which is 335 and 340. And in fact, if we go back, to our question here, it enumerated field codes, agents, and the documents. So which pair of fault codes is filling in the field but has zero documentation anywhere in the library? And that would be this one here. And, yeah, so that would that would that would complete the lesson if we... But then but then for the last question, because we have a few more minutes left. And then I'll go to your questions after this. We have, what are the common patterns across our bolt ins and recalls, and how many of our cars does this affect? It finished returning that. And we sorta answered this question before, I think, kind of, when we were on that theme section. But here, basically, we see it returned 13 system level repair family. So those are the themes directly. The bulletins and recalls repeat one pattern. A single name component fails. The documents to which part failed, and many say revised or replace it. The fleet is in at least 821 of them or 48% have a repair using one of the four superseded parts below. And so it it lists those parts here. So some of this goes back to how we synthesize the data because I synthesized it to be a lot of this sort of superseding replacement part here. But you can see it's, like, identifying, like, hey. We have, you know, a ton of, you know, these ignition coil and timing belt issues, and those show up sort of under that that one theme that contains them. So for comparison, the revised parts have few comebacks. The other families follow the same shape with a lower comeback rate in vehicle counts. So it's saying, like, the family... These are, like, the the families and then all the, parts and vehicle fixes underneath them. So the theme shade cover the whole library across all questions, about the different recalls and and bolt in. So, basically, what it's doing here in summary is it's identifying these themes and then the fixes that fall under these themes. I wish it visualized it a little bit better here because it's just sort of saying the... It's not saying the theme these fall under, and it could be my my use of Sonnen instead of Opus. But it it can identify, like, the ignition coils, you know, or or a big area, for example, and a big theme inside of this, repair shop or or, series of shops. So, anyway, that's that's the workshop. There's another section inside of here that covers, basically, like, the fact that you can port this pattern, you know, not just to Databricks, but really any data warehouse. I'm not gonna go through that here because a lot of it's more conceptual. So, you know, just just to sort of bring the point home, this here is is what we went over, this pattern. And this pattern works with any warehouse and, in theory, any sort of set of documents in cloud storage. You would have to make some changes to the scripts, but it's schema agnostic, so it's meant for you to apply anywhere. So with that, I'm happy to answer questions, until we reach the end of time, and I can go a little bit over, Alex, if you... If you'd like. Super. Amazing. Thank you very much, Zach, and Ryan for for the workshop. Thank you very much, Martin, for answering questions in the in the back. Thank you everybody for for watching. I think we covered, all of the questions. I don't think... Oh, well, there is one. Alright. Let's let's do a couple of... Maybe before, and if people have to drop off, thank you for for watching today. Thank you for your question. Thank you for participating. Road to Nodes continues next Thursday. So if you are not registered for the next workshop that's gonna be covering virtual graphs, I have shared the link in chat. Check it out. Register and join us next Thursday. Hopefully, you registered for notes. If you like the events and if you like what you see here, then please share it also on your social media. Would be nice to get a little bit more folks to to join our workshops and and notes itself. And, with that, yeah, I think we have a little bit of time, to cover, a couple of questions. Other than that, feel free to to drop off, obviously. There's one, that asks, how difficult or easy is it to update document graph if there are changes in the documents? So the great thing about the way we're loading data here is that it's all, programmatic. So you can re... So if there's a change in a document, you can... If the document's sort of corpus is small enough, you can remove it and reupload the whole thing. There's another project that I have called knowledge index or key. If you search for Kaparthy Wiki with Neo four j and my name, Zach, you'll find a blog on it. And that project actually has a way to do a change in part of the document tree. So, like, imagine you had... You know, we were loading, like, tens of thousands of documents or more. You wouldn't wanna, like, blow the whole database away and reload the whole thing. And so there's a way to, like, focus on part of that tree and, like, just reload that. So I have open source code for that. And so, yeah, that's... You know, with with this simple thing where we're going off of document structure, that's pretty easy to do. There's some complications around it, but the... But it's it's definitely possible to update it, and it's not too hard. Amazing. I just checked... I think I found the link, to your blog. I just shared it in chat. Yeah. Exactly. It's this one. KG also found it. Perfect. And then another question. How do I handle document with versions? I think that's the same question. Right? Yeah. Goes in. the same... I mean, it's it's similar. Well, in? direction. So, like, a lot of times it... And it depends, like, for for some workflows, people will store their documents somewhere where there's version control, the source documents, whether that be in cloud storage, you can have version control. Or if it's in Git, you can version control it. And then you use the graph as a means of searching, like a downstream, sort of not the data... The file system, but where you actually expose it for search. So that's one way to handle it if you don't need to read revisions. If you do need to read revisions, you can have... You just make your schema so that you have, like, a revision ID or you have a document that points to its revisions. And then whenever you do a query, you can, like, use latest revision as part of the properties. It's a little bit more complicated, but you would basically make your own custom data model if read of revisions was important. If reading of the revisions isn't important, you just want the latest, use some other version control system with cloud storage or the file system or whatever would be my first instinct. Cool. Alright. I think that's that's it, at the end of the workshop. Thank you very much again, Zach Ryan, for for running us through, for helping, with questions and obviously for developing the workshop in the first place. I think it was very, very interesting, very, very, good feedback in chat. As I said in the beginning, the workshop in itself on GraphAcademy will be available for you forever. As we said also at the beginning, the API keys for Anthropic and the, Databricks, access will unfortunately not be able to keep, up, but you can, like we said, you can use, BigQuery or you can use your own, API keys to to run it. It should be relatively low, low on the cost side, so it should be possible for you to to replicate that on your own. And, the video, this was recorded, so the video, will be in your inbox probably, tomorrow at this time. It's gonna be processed and it'll be ready for you, so you can obviously watch this at any time. And, yeah, thank you for watching. Thank you for attending. Thank you for a question. Thank you for participating and paying attention. And I hope to see you next week on, Road to Notes with virtual graphs or somewhere else, at an event or conference. Until then, have a good one. See you soon, and bye bye. Alright. And one more thing maybe before we go. We have a startup program. Of course. So I've, I've. been. told, Alex, we should mention this, and I'll do... What I'll do is just go to, I think... What is it? Neo4j.comstartup. Flash start up. Yeah. So if you are a startup and you want some free Aura credits, go ahead and apply. And, you know, we offer help, and we offer free Aura usage. So it's a pretty simple application process. And, yeah, we just wanted to we just wanted to throw that one out there before before you left. Alrighty. Okay. Thank you. I am done now. Alright. Thank you, everyone.