From 842e89eb8fedbf0bf605e4d9c80914daa9e1d43f Mon Sep 17 00:00:00 2001 From: Cristiano Hoshikawa Date: Thu, 10 Jul 2025 09:26:27 -0300 Subject: [PATCH] First Commit --- .idea/.gitignore | 12 + .idea/codeStyles/Project.xml | 7 + .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/oci_graph_23ai.iml | 9 + .idea/vcs.xml | 6 + files/main.py | 503 +++++++++++++++++++++++++++ images/img.png | Bin 0 -> 38244 bytes images/img_1.png | Bin 0 -> 55161 bytes index.md | 323 +++++++++++++++++ 11 files changed, 879 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/oci_graph_23ai.iml create mode 100644 .idea/vcs.xml create mode 100644 files/main.py create mode 100644 images/img.png create mode 100644 images/img_1.png create mode 100644 index.md diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..7d9a8e5 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,12 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Environment-dependent path to Maven home directory +/mavenHomeManager.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Zeppelin ignored files +/ZeppelinRemoteNotebooks/ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..919ce1f --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..a55e7a1 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..e5af510 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..e4adfc2 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/oci_graph_23ai.iml b/.idea/oci_graph_23ai.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/oci_graph_23ai.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/files/main.py b/files/main.py new file mode 100644 index 0000000..f8cb3c6 --- /dev/null +++ b/files/main.py @@ -0,0 +1,503 @@ +from langchain_community.chat_models.oci_generative_ai import ChatOCIGenAI +from langchain_core.prompts import PromptTemplate +from langchain.schema.output_parser import StrOutputParser +from langchain_community.embeddings import OCIGenAIEmbeddings +from langchain_community.vectorstores import FAISS +from langchain.schema.runnable import RunnableMap +from langchain_community.document_loaders import UnstructuredPDFLoader, PyMuPDFLoader +from langchain_core.documents import Document +from langchain_core.runnables import RunnableLambda + +from tqdm import tqdm +import os +import pickle +import re +import atexit +import oracledb + +# ========================= +# Oracle Autonomous Configuration +# ========================= +WALLET_PATH = "Wallet_oradb23ai" # Your Wallet for Autonomous Database downloaded and unziped folder +DB_ALIAS = "oradb23ai_high" # Your database name plus _high as your TNS Definitions +USERNAME = "USERNAME" # Your Wallet username +PASSWORD = "PASSWORD" # Your Wallet password +os.environ["TNS_ADMIN"] = WALLET_PATH +GRAPH_NAME = "my_graph" + +oracle_conn = oracledb.connect( + user=USERNAME, + password=PASSWORD, + dsn=DB_ALIAS, + config_dir=WALLET_PATH, + wallet_location=WALLET_PATH, + wallet_password=PASSWORD +) +atexit.register(lambda: oracle_conn.close()) + +# ========================= +# Oracle Graph Client +# ========================= +def create_tables_if_not_exist(conn): + cursor = conn.cursor() + + try: + cursor.execute(""" + BEGIN + EXECUTE IMMEDIATE ' + CREATE TABLE ENTITIES ( + ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY, + NAME VARCHAR2(500) + ) + '; + EXCEPTION + WHEN OTHERS THEN + IF SQLCODE != -955 THEN + RAISE; + END IF; + END; + """) + cursor.execute(""" + BEGIN + EXECUTE IMMEDIATE ' + CREATE TABLE RELATIONS ( + ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY PRIMARY KEY, + SOURCE_ID NUMBER, + TARGET_ID NUMBER, + RELATION_TYPE VARCHAR2(100), + SOURCE_TEXT VARCHAR2(4000) + ) + '; + EXCEPTION + WHEN OTHERS THEN + IF SQLCODE != -955 THEN + RAISE; + END IF; + END; + """) + conn.commit() + print("βœ… ENTITIES and RELATIONS tables created or already exist.") + except Exception as e: + print(f"[ERROR] Failed to create tables: {e}") + finally: + cursor.close() + + +create_tables_if_not_exist(oracle_conn) + +# ========================= +# Global Configurations +# ========================= +INDEX_PATH = "./faiss_index" +PROCESSED_DOCS_FILE = os.path.join(INDEX_PATH, "processed_docs.pkl") +chapter_separator_regex = r"^(#{1,6} .+|\*\*.+\*\*)$" + +# ========================= +# LLM Definitions +# ========================= +llm = ChatOCIGenAI( + model_id="meta.llama-3.1-405b-instruct", + service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com", + compartment_id="ocid1.compartment.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + auth_profile="DEFAULT", + model_kwargs={"temperature": 0.7, "top_p": 0.75, "max_tokens": 4000}, +) + +llm_for_rag = ChatOCIGenAI( + model_id="meta.llama-3.1-405b-instruct", + service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com", + compartment_id="ocid1.compartment.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + auth_profile="DEFAULT", +) + +embeddings = OCIGenAIEmbeddings( + model_id="cohere.embed-multilingual-v3.0", + service_endpoint="https://inference.generativeai.us-chicago-1.oci.oraclecloud.com", + compartment_id="ocid1.compartment.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + auth_profile="DEFAULT", +) + +def create_knowledge_graph(chunks): + cursor = oracle_conn.cursor() + + # Creates graph if it does not exist + try: + cursor.execute(f""" + BEGIN + EXECUTE IMMEDIATE ' + CREATE PROPERTY GRAPH {GRAPH_NAME} + VERTEX TABLES (ENTITIES + KEY (ID) + LABEL ENTITIES + PROPERTIES (NAME)) + EDGE TABLES (RELATIONS + KEY (ID) + SOURCE KEY (SOURCE_ID) REFERENCES ENTITIES(ID) + DESTINATION KEY (TARGET_ID) REFERENCES ENTITIES(ID) + LABEL RELATIONS + PROPERTIES (RELATION_TYPE, SOURCE_TEXT)) + '; + EXCEPTION + WHEN OTHERS THEN + IF SQLCODE != -55358 THEN -- ORA-55358: Graph already exists + RAISE; + END IF; + END; + """) + print(f"🧠 Graph '{GRAPH_NAME}' created or already exists.") + except Exception as e: + print(f"[GRAPH ERROR] Failed to create graph: {e}") + + # Inserting vertices and edges into the tables + for doc in chunks: + text = doc.page_content + source = doc.metadata.get("source", "unknown") + + if not text.strip(): + continue + + prompt = f""" + You are an expert in knowledge extraction. + + Given the following technical text: + + {text} + + Extract key entities and relationships in the format: + - Entity1 -[RELATION]-> Entity2 + + Use UPPERCASE for RELATION types. + Return 'NONE' if nothing found. + """ + try: + response = llm_for_rag.invoke(prompt) + result = response.content.strip() + except Exception as e: + print(f"[ERROR] Gen AI call error: {e}") + continue + + if result.upper() == "NONE": + continue + + triples = result.splitlines() + for triple in triples: + parts = triple.split("-[") + if len(parts) != 2: + continue + + right_part = parts[1].split("]->") + if len(right_part) != 2: + continue + + raw_relation, entity2 = right_part + relation = re.sub(r'\W+', '_', raw_relation.strip().upper()) + entity1 = parts[0].strip() + entity2 = entity2.strip() + + try: + # Insertion of entities (with existence check) + cursor.execute("MERGE INTO ENTITIES e USING (SELECT :name AS NAME FROM dual) src ON (e.name = src.name) WHEN NOT MATCHED THEN INSERT (NAME) VALUES (:name)", [entity1, entity1]) + cursor.execute("MERGE INTO ENTITIES e USING (SELECT :name AS NAME FROM dual) src ON (e.name = src.name) WHEN NOT MATCHED THEN INSERT (NAME) VALUES (:name)", [entity2, entity2]) + # Retrieve the IDs + cursor.execute("SELECT ID FROM ENTITIES WHERE NAME = :name", [entity1]) + source_id = cursor.fetchone()[0] + cursor.execute("SELECT ID FROM ENTITIES WHERE NAME = :name", [entity2]) + target_id = cursor.fetchone()[0] + # Create relations + cursor.execute(""" + INSERT INTO RELATIONS (SOURCE_ID, TARGET_ID, RELATION_TYPE, SOURCE_TEXT) + VALUES (:src, :tgt, :rel, :txt) + """, [source_id, target_id, relation, source]) + print(f"βœ… {entity1} -[{relation}]-> {entity2}") + except Exception as e: + print(f"[INSERT ERROR] {e}") + + oracle_conn.commit() + cursor.close() + print("πŸ’Ύ Knowledge graph updated.") + +def extract_graph_keywords(question: str) -> str: + prompt = f""" + Based on the question below, extract relevant keywords (1 to 2 words per term) that can be used to search for entities and relationships in a technical knowledge graph. + + Question: "{question}" + + Rules: + - Split compound terms (e.g., "API Gateway" β†’ "API", "Gateway") + - Remove duplicates + - Do not include generic words such as: "what", "how", "the", "of", "in the document", etc. + - Return only the keywords, separated by commas. No explanations. + + Result: + """ + try: + resp = llm_for_rag.invoke(prompt) + keywords_raw = resp.content.strip() + + # Additional post-processing: remove duplicates, normalize + keywords = {kw.strip().lower() for kw in re.split(r'[,\n]+', keywords_raw)} + keywords = [kw for kw in keywords if kw] # remove empty strings + return ", ".join(sorted(keywords)) + except Exception as e: + print(f"[KEYWORD EXTRACTION ERROR] {e}") + return "" + +def query_knowledge_graph(query_text): + cursor = oracle_conn.cursor() + + sanitized_text = query_text.lower() + + pgql = f""" + SELECT from_entity, + relation_type, + to_entity + FROM GRAPH_TABLE( + {GRAPH_NAME} + MATCH (e1 is ENTITIES)-[r is RELATIONS]->(e2 is ENTITIES) + WHERE CONTAINS(e1.name, '{sanitized_text}') > 0 + OR CONTAINS(e2.name, '{sanitized_text}') > 0 + OR CONTAINS(r.RELATION_TYPE, '{sanitized_text}') > 0 + COLUMNS ( + e1.name AS from_entity, + r.RELATION_TYPE AS relation_type, + e2.name AS to_entity + ) + ) + FETCH FIRST 20 ROWS ONLY + """ + + print(pgql) + + try: + cursor.execute(pgql) + rows = cursor.fetchall() + if not rows: + return "⚠️ No relationships found in the graph." + + return "\n".join(f"{r[0]} -[{r[1]}]-> {r[2]}" for r in rows) + + except Exception as e: + return f"[PGQL ERROR] {e}" + + finally: + cursor.close() + +def split_llm_output_into_chapters(llm_text): + chapters = [] + current_chapter = [] + lines = llm_text.splitlines() + + for line in lines: + if re.match(chapter_separator_regex, line): + if current_chapter: + chapters.append("\n".join(current_chapter).strip()) + current_chapter = [line] + else: + current_chapter.append(line) + + if current_chapter: + chapters.append("\n".join(current_chapter).strip()) + + return chapters + + +def semantic_chunking(text): + prompt = f""" + You received the following text extracted via OCR: + + {text} + + Your task: + 1. Identify headings (short uppercase or bold lines, no period at the end) + 2. Separate paragraphs by heading + 3. Indicate columns with [COLUMN 1], [COLUMN 2] if present + 4. Indicate tables with [TABLE] in markdown format + """ + + get_out = False + while not get_out: + try: + response = llm_for_rag.invoke(prompt) + get_out = True + except: + print("[ERROR] Gen AI call error") + + return response + + +def read_pdfs(pdf_path): + if "-ocr" in pdf_path: + doc_pages = PyMuPDFLoader(str(pdf_path)).load() + else: + doc_pages = UnstructuredPDFLoader(str(pdf_path)).load() + full_text = "\n".join([page.page_content for page in doc_pages]) + return full_text + + +def smart_split_text(text, max_chunk_size=10_000): + chunks = [] + start = 0 + text_length = len(text) + + while start < text_length: + end = min(start + max_chunk_size, text_length) + split_point = max( + text.rfind('.', start, end), + text.rfind('!', start, end), + text.rfind('?', start, end), + text.rfind('\n\n', start, end) + ) + if split_point == -1 or split_point <= start: + split_point = end + else: + split_point += 1 + + chunk = text[start:split_point].strip() + if chunk: + chunks.append(chunk) + + start = split_point + + return chunks + + +def load_previously_indexed_docs(): + if os.path.exists(PROCESSED_DOCS_FILE): + with open(PROCESSED_DOCS_FILE, "rb") as f: + return pickle.load(f) + return set() + + +def save_indexed_docs(docs): + with open(PROCESSED_DOCS_FILE, "wb") as f: + pickle.dump(docs, f) + + +# ========================= +# Main Function +# ========================= +def chat(): + # pdf_paths = [ + # './Manuals/SOASUITE.pdf', + # './Manuals/using-integrations-oracle-integration-3.pdf' + # ] + + pdf_paths = ['AAAAAAAAAA.pdf'] # Your PDF Files as a Knowledge Base + + already_indexed_docs = load_previously_indexed_docs() + updated_docs = set() + + try: + vectorstore = FAISS.load_local(INDEX_PATH, embeddings, allow_dangerous_deserialization=True) + print("βœ”οΈ FAISS index loaded.") + except Exception: + print("⚠️ FAISS index not found, creating a new one.") + vectorstore = None + + new_chunks = [] + + for pdf_path in tqdm(pdf_paths, desc=f"πŸ“„ Processing PDFs"): + print(f" {os.path.basename(pdf_path)}") + if pdf_path in already_indexed_docs: + print(f"βœ… Document already indexed: {pdf_path}") + continue + full_text = read_pdfs(pdf_path=pdf_path) + + text_chunks = smart_split_text(full_text, max_chunk_size=10_000) + overflow_buffer = "" + + for chunk in tqdm(text_chunks, desc=f"πŸ“„ Processing text chunks", dynamic_ncols=True, leave=False): + current_text = overflow_buffer + chunk + + treated_text = semantic_chunking(current_text) + + if hasattr(treated_text, "content"): + chapters = split_llm_output_into_chapters(treated_text.content) + + last_chapter = chapters[-1] if chapters else "" + + if last_chapter and not last_chapter.strip().endswith((".", "!", "?", "\n\n")): + print("πŸ“Œ Last chapter seems incomplete, saving for the next cycle") + overflow_buffer = last_chapter + chapters = chapters[:-1] + else: + overflow_buffer = "" + + for chapter_text in chapters: + doc = Document(page_content=chapter_text, metadata={"source": pdf_path}) + new_chunks.append(doc) + print(f"βœ… New chapter indexed:\n{chapter_text}...\n") + + else: + print(f"[ERROR] semantic_chunking returned unexpected type: {type(treated_text)}") + + updated_docs.add(str(pdf_path)) + + if new_chunks: + if vectorstore: + vectorstore.add_documents(new_chunks) + else: + vectorstore = FAISS.from_documents(new_chunks, embedding=embeddings) + + vectorstore.save_local(INDEX_PATH) + save_indexed_docs(already_indexed_docs.union(updated_docs)) + print(f"πŸ’Ύ {len(new_chunks)} chunks added to FAISS index.") + + print("🧠 Building knowledge graph...") + create_knowledge_graph(new_chunks) + + else: + print("πŸ“ No new documents to index.") + + retriever = vectorstore.as_retriever(search_type="similarity", search_kwargs={"k": 50, "fetch_k": 100}) + + template = """ + Document context: + {context} + + Graph context: + {graph_context} + + Question: + {input} + + Interpretation rules: + - You can search for a step-by-step tutorial about a subject + - You can search a concept description about a subject + - You can search for a list of components about a subject + """ + prompt = PromptTemplate.from_template(template) + + def get_context(x): + query = x.get("input") if isinstance(x, dict) else x + return retriever.invoke(query) + + chain = ( + RunnableMap({ + "context": RunnableLambda(get_context), + "graph_context": RunnableLambda(lambda x: query_knowledge_graph(extract_graph_keywords(x.get("input") if isinstance(x, dict) else x))), + "input": lambda x: x.get("input") if isinstance(x, dict) else x + }) + | prompt + | llm + | StrOutputParser() + ) + + print("βœ… READY") + + while True: + query = input("❓ Question (or 'quit' to exit): ") + if query.lower() == "quit": + break + response = chain.invoke(query) + print("\nπŸ“œ RESPONSE:\n") + print(response) + print("\n" + "=" * 80 + "\n") + +# if __name__ == "__main__": +# print("Iniciando") +# print(query_knowledge_graph("gateway")) + +# πŸš€ Run +if __name__ == "__main__": + chat() \ No newline at end of file diff --git a/images/img.png b/images/img.png new file mode 100644 index 0000000000000000000000000000000000000000..b36dc0bcc0833dc223a8af5ed58a364f418822e3 GIT binary patch literal 38244 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 Entity2 + + Use UPPERCASE for RELATION types. + Return 'NONE' if nothing found. + """ + try: + response = llm_for_rag.invoke(prompt) + result = response.content.strip() + except Exception as e: + print(f"[ERROR] Gen AI call error: {e}") + continue + + if result.upper() == "NONE": + continue + + triples = result.splitlines() + for triple in triples: + parts = triple.split("-[") + if len(parts) != 2: + continue + + right_part = parts[1].split("]->") + if len(right_part) != 2: + continue + + raw_relation, entity2 = right_part + relation = re.sub(r'\W+', '_', raw_relation.strip().upper()) + entity1 = parts[0].strip() + entity2 = entity2.strip() + + try: + # Insertion of entities (with existence check) + cursor.execute("MERGE INTO ENTITIES e USING (SELECT :name AS NAME FROM dual) src ON (e.name = src.name) WHEN NOT MATCHED THEN INSERT (NAME) VALUES (:name)", [entity1, entity1]) + cursor.execute("MERGE INTO ENTITIES e USING (SELECT :name AS NAME FROM dual) src ON (e.name = src.name) WHEN NOT MATCHED THEN INSERT (NAME) VALUES (:name)", [entity2, entity2]) + # Retrieve the IDs + cursor.execute("SELECT ID FROM ENTITIES WHERE NAME = :name", [entity1]) + source_id = cursor.fetchone()[0] + cursor.execute("SELECT ID FROM ENTITIES WHERE NAME = :name", [entity2]) + target_id = cursor.fetchone()[0] + # Create relations + cursor.execute(""" + INSERT INTO RELATIONS (SOURCE_ID, TARGET_ID, RELATION_TYPE, SOURCE_TEXT) + VALUES (:src, :tgt, :rel, :txt) + """, [source_id, target_id, relation, source]) + print(f"βœ… {entity1} -[{relation}]-> {entity2}") + except Exception as e: + print(f"[INSERT ERROR] {e}") + + oracle_conn.commit() + cursor.close() + print("πŸ’Ύ Knowledge graph updated.") +``` + + +β€’ The graph schema is created with CREATE PROPERTY GRAPH, linking ENTITIES (vertices) and RELATIONS (edges). + +β€’ Uses MERGE INTO to insert new entities only if they don’t exist (ensuring uniqueness). + +β€’ LLM (Oracle Generative AI) is used to extract triples of the form Entity1 -[RELATION]-> Entity2. + +β€’ All interactions with Oracle are done via oracledb and PL/SQL anonymous blocks. + +#### Next Steps + + +β€’ Use PGQL to explore and query graph relationships. + +β€’ Connect to Graph Studio for visualizations. + +β€’ Expose the graph through an API REST or LangChain Agent. + +### πŸ“Œ Graph Query Support Functions + +There are two essential functions that enable semantic search and reasoning over the knowledge graph: **extract_graph_keywords** and **query_knowledge_graph**. These components allow questions to be interpreted into meaningful graph queries using PGQL on Oracle Autonomous Database. + +#### extract_graph_keywords + +```python +def extract_graph_keywords(question: str) -> str: + prompt = f""" + Based on the question below, extract relevant keywords (1 to 2 words per term) that can be used to search for entities and relationships in a technical knowledge graph. + + Question: "{question}" + + Rules: + - Split compound terms (e.g., "API Gateway" β†’ "API", "Gateway") + - Remove duplicates + - Do not include generic words such as: "what", "how", "the", "of", "in the document", etc. + - Return only the keywords, separated by commas. No explanations. + + Result: + """ + try: + resp = llm_for_rag.invoke(prompt) + keywords_raw = resp.content.strip() + + # Additional post-processing: remove duplicates, normalize + keywords = {kw.strip().lower() for kw in re.split(r'[,\n]+', keywords_raw)} + keywords = [kw for kw in keywords if kw] # remove empty strings + return ", ".join(sorted(keywords)) + except Exception as e: + print(f"[KEYWORD EXTRACTION ERROR] {e}") + return "" +``` + +βœ… What it does: + +β€’ Uses an LLM (llm_for_rag) to transform natural language questions into a list of graph-friendly keywords. + +β€’ The prompt is designed to cleanly extract entities and terms that are relevant for searching the graph. + +πŸ’‘ Why it’s important: + +β€’ It bridges the gap between unstructured questions and structured queries. + +β€’ Ensures that only specific, domain-relevant terms are used for matching in the PGQL query. + +🧠 LLM-enhanced behavior: + +β€’ Breaks compound technical terms. + +β€’ Removes stop words (like β€œwhat”, β€œhow”, etc.). + +β€’ Normalizes text by lowercasing and deduplicating terms. + +πŸ“Œ Example: + + Input: + + "What are the main components of an API Gateway architecture?" + + + Output keywords: + + api, gateway, architecture, components + +#### query_knowledge_graph + +```python +def query_knowledge_graph(query_text): + cursor = oracle_conn.cursor() + + sanitized_text = query_text.lower() + + pgql = f""" + SELECT from_entity, + relation_type, + to_entity + FROM GRAPH_TABLE( + {GRAPH_NAME} + MATCH (e1 is ENTITIES)-[r is RELATIONS]->(e2 is ENTITIES) + WHERE CONTAINS(e1.name, '{sanitized_text}') > 0 + OR CONTAINS(e2.name, '{sanitized_text}') > 0 + OR CONTAINS(r.RELATION_TYPE, '{sanitized_text}') > 0 + COLUMNS ( + e1.name AS from_entity, + r.RELATION_TYPE AS relation_type, + e2.name AS to_entity + ) + ) + FETCH FIRST 20 ROWS ONLY + """ + + print(pgql) + + try: + cursor.execute(pgql) + rows = cursor.fetchall() + if not rows: + return "⚠️ No relationships found in the graph." + + return "\n".join(f"{r[0]} -[{r[1]}]-> {r[2]}" for r in rows) + + except Exception as e: + return f"[PGQL ERROR] {e}" + + finally: + cursor.close() +``` + + +βœ… What it does: + +β€’ Accepts a keyword-based string (often produced by extract_graph_keywords) and constructs a PGQL query to retrieve relationships from the knowledge graph. + +βš™οΈ Key mechanics: + +β€’ The GRAPH_TABLE clause uses MATCH to traverse the graph from source to target node. + +β€’ It uses CONTAINS() to allow partial and fuzzy search in node/edge attributes (e1.name, e2.name, r.RELATION_TYPE). + +β€’ Limits results to 20 to avoid flooding the output. + +πŸ†š Why use Oracle PGQL: + +β€’ PGQL (Property Graph Query Language) is SQL-like but designed for graph traversal. + +β€’ Oracle Autonomous Database supports property graphs, which allows seamless integration between relational and graph worlds. + +β€’ Offers indexing, optimization, and native graph search capabilities that are enterprise-ready. + +🧠 Oracle-Specific Notes: + +β€’ The GRAPH_TABLE() is unique to Oracle PGQL and allows queries over logical views of graphs defined via relational tables. + +β€’ Unlike Cypher (Neo4j), PGQL runs over structured data using SQL extensions, making it friendlier in RDBMS-heavy environments. + +## Reference + +- [Analyze PDF Documents in Natural Language with OCI Generative AI](https://docs.oracle.com/en/learn/oci-genai-pdf/) +- [Oracle Graph Learning Path](https://blogs.oracle.com/database/post/oracle-graph-learning-path) +- [Graph Developer's Guide for Property Graph](https://docs.oracle.com/en/database/oracle/property-graph/25.2/spgdg/oracle-graph-python-client.html#GUID-9800E556-0B6C-4EAF-A4FC-9AE9AB46023C) +- [Getting Started with Property Graphs in Oracle Database 23ai](https://blogs.oracle.com/ace/post/getting-started-with-property-graphs-in-oracle-database-23ai) + +## Acknowledgments + +- **Author** - Cristiano Hoshikawa (Oracle LAD A-Team Solution Engineer)