Graph RAG with LangChain and Neo4j
Adam Cowley
Manager, Developer Education at Neo4j
What is it like to work at Neo4j?
What is it like to work at Neo4j?
What is it like to work at Neo4j?
text
property
text
propertyfrom langchain_neo4j import Neo4jVector
Neo4jVector.from_documents()
: Create nodes and underlying index from Document
sNeo4jVector.from_existing_graph()
: Create index on existing label and property combinationsres = graph.query("""
MATCH (s:Scene)
WHERE NOT {(s)-[:HAS_LINE]->()}
RETURN s.id AS id, s.text AS text
""")
for scene in res: # Create chunks from scene['text']
text
by "\n\n"
Enter Sampson and Gregory armed with swords..
SAMPSON.
Gregory, on my word...
GREGORY. No, for then we should...
SAMPSON. I mean, if we be in choler, we'll draw...
# Split text into lines lines = [ line.strip() for line in text.split("\n\n")
if "\n" in line
]
for line in lines: parts = line.split("\n")
character = parts[0]
text = "\n".join(parts[1:])
# ...Continuing loop over scenes line_node = Node(type="Line", id=f"{scene.id}-line-{i}", properties={}) character_node = Node(type="Character", id=character, properties={})
# (:Scene)-[:HAS_LINE]->(:Line) graph_document.relationships.append( Relationship(source=scene, target=line_node, type="HAS_LINE"))
# (:Line)-[:SPOKEN_BY]->(:Character) graph_document.relationships.append(Relationship( source=line_node, target=characters[character], type="SPOKEN_BY"))
from langchain_openai import OpenAIEmbeddings
store = Neo4jVector.from_existing_graph(
OpenAIEmbeddings(model="text-embedding-3-small"),
url=NEO4J_URI, username=NEO4J_USERNAME, password=NEO4J_PASSWORD,
node_label="Line",
text_node_properties=["text"],
embedding_node_property="embedding",
index_name="lines",
)
# Create retriever retriever = store.as_retriever()
# Invoke manually retriever.invoke("What does Romeo think of Juliet?") # [ Document, Document, ... ]
Graph RAG with LangChain and Neo4j