Skip to main content
Archived

This project has been archived by its maintainers, and is no longer receiving any updates.

🦜️🔗 LangChain Kùzu

This package contains the LangChain integration with Kùzu, an embeddable property graph database.

📦 Installation

pip install -U langchain-kuzu

Usage

Kùzu's integration with LangChain makes it convenient to create and update graphs from unstructured text, and also to query graphs via a Text2Cypher pipeline that utilizes the power of LangChain's LLM chains. In this section, we'll cover an example of how to use the KuzuGraph and KuzuQAChain classes to create a graph, add nodes and relationships, and query the graph in conjunction with OpenAI's LLMs.

Let's install some additional dependencies:

pip install -U langchain-openai langchain-experimental

Creating a graph

text = "Tim Cook is the CEO of Apple. Apple has its headquarters in California."

First define the LLM to use for graph extraction, and the schema for the graph.

# Define schema
allowed_nodes = ["Person", "Company", "Location"]
allowed_relationships = [
    ("Person", "IS_CEO_OF", "Company"),
    ("Company", "HAS_HEADQUARTERS_IN", "Location"),
]

The LLMGraphTransformer class is used to convert the text into a graph document.

from langchain_experimental.graph_transformers import LLMGraphTransformer
from langchain_openai import ChatOpenAI

# Define the LLMGraphTransformer
llm_transformer = LLMGraphTransformer(
    llm=ChatOpenAI(model="gpt-4o-mini", temperature=0, api_key=OPENAI_API_KEY),
    allowed_nodes=allowed_nodes,
    allowed_relationships=allowed_relationships,
)
from langchain_core.documents import Document

# Convert the given text into graph documents
documents = [Document(page_content=text)]
graph_documents = llm_transformer.convert_to_graph_documents(documents)

To ingest the graph documents directly into a Kùzu database, we can use the KuzuGraph class.

import kuzu
from langchain_kuzu.graphs.kuzu_graph import KuzuGraph

db = kuzu.Database("test_db")

# Create a graph object
graph = KuzuGraph(db, allow_dangerous_requests=True)

# Add the graph document to the graph
graph.add_graph_documents(
    graph_documents,
    include_source=True,
)

Query the graph

To query the graph, we can define a KuzuQAChain object. Then, we can invoke the chain with a query by connecting to the existing database that's stored in the test_db directory as per the previous step.

import kuzu
from langchain_kuzu.graphs.kuzu_graph import KuzuGraph
from langchain_kuzu.chains.graph_qa.kuzu import KuzuQAChain

db = kuzu.Database("test_db")
graph = KuzuGraph(db, allow_dangerous_requests=True)

# Create the KuzuQAChain with verbosity enabled to see the generated Cypher queries
chain = KuzuQAChain.from_llm(
    llm=ChatOpenAI(model="gpt-4o-mini", temperature=0.3, api_key=OPENAI_API_KEY),
    graph=graph,
    verbose=True,
    allow_dangerous_requests=True,
)

# Query the graph
queries = [
    "Who is the CEO of Apple?",
    "Where is Apple headquartered?",
]

for query in queries:
    result = chain.invoke(query)
    print(f"Query: {query}\nResult: {result}\n")

The following is the output:

> Entering new KuzuQAChain chain...
Generated Cypher:
MATCH (p:Person)-[:IS_CEO_OF]->(c:Company) WHERE c.id = 'Apple' RETURN p.id
Full Context:
[{'p.id': 'Tim Cook'}]

> Finished chain.
Query: Who is the CEO of Apple?
Result: {'query': 'Who is the CEO of Apple?', 'result': 'Tim Cook is the CEO of Apple.'}



> Entering new KuzuQAChain chain...
Generated Cypher:
MATCH (c:Company {id: "Apple"})-[:HAS_HEADQUARTERS_IN]->(l:Location) RETURN l.id
Full Context:
[{'l.id': 'California'}]

> Finished chain.
Query: Where is Apple headquartered?
Result: {'query': 'Where is Apple headquartered?', 'result': 'Apple is headquartered in California.'}

Updating the graph

You can update or mutate the graph's state by connecting to the existing database and running your own Cypher queries.

import kuzu

db = kuzu.Database("test_db")
conn = kuzu.Connection(db)

# Create a new relationship table
conn.execute("CREATE REL TABLE IS_COO_OF(FROM Person TO Company)")

# Add a new person-company relationship for Jeff Williams, the COO of Apple
conn.execute("CREATE (p:Person {id: 'Jeff Williams'})")
conn.execute(
    """
    MATCH (c:Company {id: 'Apple'}), (p:Person {id: 'Jeff Williams'})
    CREATE (p)-[:IS_COO_OF]->(c)
    """
)

Release files for langchain-kuzu 0.4.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for langchain-kuzu 0.4.2
File Size Uploaded
langchain_kuzu-0.4.2.tar.gz 13.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for langchain-kuzu 0.4.2
File Interpreter ABI Platform
langchain_kuzu-0.4.2-py3-none-any.whl Python 3 none any Details

Total release size: 25.6 kB

Release files / langchain_kuzu-0.4.2.tar.gz

Download URL langchain_kuzu-0.4.2.tar.gz
Size 13.9 kB
Tags Source
SHA-256 checksum
How to use checksums
aad5785f8c132195077c616dea76573de8f0b0d4aa84244b07fddc3e7495a5b5
BLAKE2b-256 checksum
How to use checksums
d36cdfba0ca47ca43cd27a27df0aaf277e2d8ff6fb173c3d4d9228bb9c53fd37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9

Release files / langchain_kuzu-0.4.2-py3-none-any.whl

Download URL langchain_kuzu-0.4.2-py3-none-any.whl
Size 11.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
dcc23bc5b5d98132d69d00a48e2d98f6762e7ccd419e3b5ea0c0d1b502b63946
BLAKE2b-256 checksum
How to use checksums
a2d24553743b0531f3163ca5abdc82c092284d6beda4cfc0f99aea3f2c5c29cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.12.9
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page