Update an existing graph¶
In this notebook, we'll gradually construct Harry Potter and the Chamber of Secrets by going through the text and adding it chunk by chunk.
Install required pip packages
pip install pypdf tqdm pymongo
In [ ]:
Copied!
import os
from pypdf import PdfReader
from tqdm import tqdm
from bson import ObjectId
from whyhow import WhyHow
from whyhow.schemas import SchemaEntity, SchemaRelation, SchemaTriplePattern, Chunk
import os
from pypdf import PdfReader
from tqdm import tqdm
from bson import ObjectId
from whyhow import WhyHow
from whyhow.schemas import SchemaEntity, SchemaRelation, SchemaTriplePattern, Chunk
In [ ]:
Copied!
client = WhyHow(api_key=os.environ["WHYHOW_API_KEY"], base_url=os.environ["WHYHOW_BASE_URL"])
client = WhyHow(api_key=os.environ["WHYHOW_API_KEY"], base_url=os.environ["WHYHOW_BASE_URL"])
In [ ]:
Copied!
workspace = client.workspaces.create(name="Harry Potter Workspace")
workspace = client.workspaces.create(name="Harry Potter Workspace")
Create Schema from scratch¶
In [ ]:
Copied!
entities = [
SchemaEntity(
name="character",
description="A person appearing in the book, e.g., Harry Potter, Ron Weasley, Hermione Granger, Albus Dumbledore.",
fields=[]
),
SchemaEntity(
name="object",
description="Inanimate items that characters use or interact with, e.g., wand, Philosopher's Stone, Invisibility Cloak, broomstick.",
fields=[]
)
]
relations = [
SchemaRelation(
name="friends with",
description="Denotes a friendly relationship between characters.",
),
SchemaRelation(
name="interacts with",
description="Describes a scenario in which a character engages with another character, creature, or object.",
)
]
schema = client.schemas.create(
name="Harry Potter Schema",
workspace_id=workspace.workspace_id,
entities=entities,
relations=relations,
patterns=[
SchemaTriplePattern(
head=entities[0],
relation=relations[0],
tail=entities[0],
description="One character is friends with another, e.g., Harry Potter is friends with Ron Weasley."
),
SchemaTriplePattern(
head=entities[0],
relation=relations[1],
tail=entities[1],
description="A character interacting with an object, e.g., Harry Potter interacts with the Invisibility Cloak."
)
]
)
entities = [
SchemaEntity(
name="character",
description="A person appearing in the book, e.g., Harry Potter, Ron Weasley, Hermione Granger, Albus Dumbledore.",
fields=[]
),
SchemaEntity(
name="object",
description="Inanimate items that characters use or interact with, e.g., wand, Philosopher's Stone, Invisibility Cloak, broomstick.",
fields=[]
)
]
relations = [
SchemaRelation(
name="friends with",
description="Denotes a friendly relationship between characters.",
),
SchemaRelation(
name="interacts with",
description="Describes a scenario in which a character engages with another character, creature, or object.",
)
]
schema = client.schemas.create(
name="Harry Potter Schema",
workspace_id=workspace.workspace_id,
entities=entities,
relations=relations,
patterns=[
SchemaTriplePattern(
head=entities[0],
relation=relations[0],
tail=entities[0],
description="One character is friends with another, e.g., Harry Potter is friends with Ron Weasley."
),
SchemaTriplePattern(
head=entities[0],
relation=relations[1],
tail=entities[1],
description="A character interacting with an object, e.g., Harry Potter interacts with the Invisibility Cloak."
)
]
)
Create Graph¶
In [ ]:
Copied!
# Create graph from schema and documents
graph = client.graphs.create(
workspace_id=workspace.workspace_id,
schema_id=schema.schema_id,
name="Harry Potter Graph",
document_ids=[str(ObjectId())]
)
# Creating your graph
# Create graph from schema and documents
graph = client.graphs.create(
workspace_id=workspace.workspace_id,
schema_id=schema.schema_id,
name="Harry Potter Graph",
document_ids=[str(ObjectId())]
)
# Creating your graph
Process Documents¶
In [ ]:
Copied!
# Run with Harry Potter and the Chamber of Secrets
reader = PdfReader("documents/Harry_Potter_and_the_Chamber_of_Secrets.pdf")
# Run with Harry Potter and the Chamber of Secrets
reader = PdfReader("documents/Harry_Potter_and_the_Chamber_of_Secrets.pdf")
In [ ]:
Copied!
page_splitter = " \n "
text = page_splitter.join([page.extract_text() for page in reader.pages])
page_splitter = " \n "
text = page_splitter.join([page.extract_text() for page in reader.pages])
In [ ]:
Copied!
for i in tqdm(range(0, len(text), 1024)):
chunk = text[i:i + 1024]
chunks = client.chunks.create(
workspace_id=workspace.workspace_id,
chunks=[
Chunk(
content=chunk
)
]
)
client.graphs.add_chunks(
graph_id=graph.graph_id,
ids=[chunks[0].chunk_id]
)
for i in tqdm(range(0, len(text), 1024)):
chunk = text[i:i + 1024]
chunks = client.chunks.create(
workspace_id=workspace.workspace_id,
chunks=[
Chunk(
content=chunk
)
]
)
client.graphs.add_chunks(
graph_id=graph.graph_id,
ids=[chunks[0].chunk_id]
)
Query Graph¶
In [ ]:
Copied!
# Query graph created from schema
question = "Who is Harry friends with?"
query = client.graphs.query_unstructured(
graph_id=graph.graph_id,
query=question,
)
print("Query Response:", query.answer)
# Query graph created from schema
question = "Who is Harry friends with?"
query = client.graphs.query_unstructured(
graph_id=graph.graph_id,
query=question,
)
print("Query Response:", query.answer)
In [ ]:
Copied!
# Query graph created from schema
question = "Who is Harry friends with?"
query = client.graphs.query_unstructured(
graph_id=graph.graph_id,
query=question,
include_chunks=True
)
print("Query Response:", query.answer)
# Query graph created from schema
question = "Who is Harry friends with?"
query = client.graphs.query_unstructured(
graph_id=graph.graph_id,
query=question,
include_chunks=True
)
print("Query Response:", query.answer)
In [ ]:
Copied!
query = client.graphs.query_structured(
graph_id=graph.graph_id,
relations=["friends with"],
)
print("Query Response:")
for triple in query.triples:
print(f"{triple.head.name} {triple.relation.name} {triple.tail.name}")
query = client.graphs.query_structured(
graph_id=graph.graph_id,
relations=["friends with"],
)
print("Query Response:")
for triple in query.triples:
print(f"{triple.head.name} {triple.relation.name} {triple.tail.name}")