import os import json import pyTigerGraph as tg import pandas as pd from dotenv import load_dotenv # Load variables from the .env file in the parent directory load_dotenv("../.env") TG_HOST = os.environ.get("TG_HOST") TG_SECRET = os.environ.get("TG_SECRET") TG_GRAPH = os.environ.get("TG_GRAPH", "FinancialGraph") print(f"Connecting to TigerGraph at {TG_HOST}...") # Initialize connection (graphname="" for global schema changes) conn = tg.TigerGraphConnection(host=TG_HOST, gsqlSecret=TG_SECRET) token_response = conn.getToken(TG_SECRET) token = token_response[0] print("Authenticated successfully. Token generated.") print("\n[1/3] Building Global Schema (this may take a minute)...") schema_gsql = f""" CREATE VERTEX Company (PRIMARY_ID id STRING, name STRING) WITH PRIMARY_ID_AS_ATTRIBUTE="true" CREATE VERTEX Document (PRIMARY_ID id STRING, text_content STRING) WITH PRIMARY_ID_AS_ATTRIBUTE="true" CREATE DIRECTED EDGE HAS_DOCUMENT (FROM Company, TO Document) CREATE GRAPH {TG_GRAPH} (Company, Document, HAS_DOCUMENT) """ try: print(conn.gsql(schema_gsql)) except Exception as e: print("Schema may already exist. Proceeding...") # Re-connect specifically to the graph conn.graphname = TG_GRAPH print("\n[2/3] Preparing to load data from financial_corpus.jsonl...") companies_data = [] docs_data = [] edges_data = [] with open("financial_corpus.jsonl", "r", encoding="utf-8") as f: for i, line in enumerate(f): if not line.strip(): continue data = json.loads(line) company = data.get("company", "Unknown").strip() text = data.get("text", "") doc_id = f"doc_{i}" companies_data.append({"id": company, "name": company}) docs_data.append({"id": doc_id, "text_content": text}) edges_data.append({"source": company, "target": doc_id}) print(f"Loaded {len(docs_data)} documents from JSONL.") # Deduplicate companies companies_df = pd.DataFrame(companies_data).drop_duplicates(subset=["id"]) docs_df = pd.DataFrame(docs_data) edges_df = pd.DataFrame(edges_data) print(f"Upserting {len(companies_df)} Companies to TigerGraph...") for i in range(0, len(companies_df), 1000): conn.upsertVertexDataFrame(companies_df.iloc[i:i+1000], vertexType="Company", v_id="id") print(f"Upserting {len(docs_df)} Documents to TigerGraph... (This might take a few minutes)") for i in range(0, len(docs_df), 500): # Smaller chunks for documents because of large text conn.upsertVertexDataFrame(docs_df.iloc[i:i+500], vertexType="Document", v_id="id") print(f"Upserting {len(edges_df)} Relationships (Edges) to TigerGraph...") edges_list = [(row["source"], row["target"]) for _, row in edges_df.iterrows()] for i in range(0, len(edges_list), 1000): chunk = edges_list[i:i+1000] conn.upsertEdges(sourceVertexType="Company", edgeType="HAS_DOCUMENT", targetVertexType="Document", edges=chunk) print("Data loaded successfully!") print("\n[3/3] Installing GSQL Query 'get_company_context'...") query_gsql = f""" USE GRAPH {TG_GRAPH} CREATE OR REPLACE QUERY get_company_context(STRING question) FOR GRAPH {TG_GRAPH} {{ SetAccum @@context; # Very simple keyword search across companies Seed = {{Company.*}}; TargetCompanies = SELECT s FROM Seed:s WHERE question LIKE ("%" + s.name + "%"); Docs = SELECT d FROM TargetCompanies:s -(HAS_DOCUMENT:e)- Document:d ACCUM @@context += d.text_content; PRINT @@context as results; }} INSTALL QUERY get_company_context """ print("Running GSQL Query installation (this usually takes 2-3 minutes)...") try: print(conn.gsql(query_gsql)) except Exception as e: print(f"Query installation error: {e}") print("\n" + "="*50) print("ALL DONE! TigerGraph is now fully operational.") print("="*50) print("IMPORTANT: Copy this Bearer Token to use in your Dashboard:") print(f"{token}") print("="*50)