File size: 2,422 Bytes
2782916
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# genesis/utils/graph_tools.py
"""
Graph Utilities for GENESIS-AI
Handles writing research topics and papers into the Neo4j graph database.
"""

import logging
from typing import List, Dict, Optional
from neo4j import GraphDatabase
import os

logging.basicConfig(level=logging.INFO)

# Optional Neo4j connection
NEO4J_URI = os.getenv("NEO4J_URI")
NEO4J_USER = os.getenv("NEO4J_USER")
NEO4J_PASSWORD = os.getenv("NEO4J_PASSWORD")

driver = None
if NEO4J_URI and NEO4J_USER and NEO4J_PASSWORD:
    try:
        driver = GraphDatabase.driver(NEO4J_URI, auth=(NEO4J_USER, NEO4J_PASSWORD))
        logging.info("[Neo4j] Connected in graph_tools.")
    except Exception as e:
        logging.error(f"[Neo4j] Connection failed in graph_tools: {e}")
else:
    logging.info("[Neo4j] No URI/user/password set β€” skipping graph_tools connection.")


def write_topic_and_papers(topic: str, papers: List[Dict], db_driver: Optional[GraphDatabase.driver] = None):
    """
    Store a topic node and its related papers in Neo4j.

    Args:
        topic (str): Research topic name
        papers (List[Dict]): List of paper dicts with keys: title, authors, link
        db_driver: Optional Neo4j driver instance
    """
    if not (db_driver or driver):
        logging.warning("[GraphTools] Skipping write β€” no Neo4j connection.")
        return

    neo_driver = db_driver or driver

    try:
        with neo_driver.session() as session:
            # Create topic node
            session.run(
                """
                MERGE (t:Topic {name: $topic})
                """,
                topic=topic
            )

            # Create paper nodes and relationships
            for paper in papers:
                session.run(
                    """
                    MERGE (p:Paper {title: $title})
                    ON CREATE SET p.authors = $authors, p.link = $link
                    MERGE (t:Topic {name: $topic})
                    MERGE (t)-[:HAS_PAPER]->(p)
                    """,
                    title=paper.get("title", ""),
                    authors=paper.get("authors", []),
                    link=paper.get("link", ""),
                    topic=topic
                )

        logging.info(f"[GraphTools] Added topic '{topic}' and {len(papers)} papers.")
    except Exception as e:
        logging.error(f"[GraphTools] Error writing to Neo4j: {e}")


__all__ = ["write_topic_and_papers"]