From 57e7b1fd365302d5d39382ed570c62977112984c Mon Sep 17 00:00:00 2001 From: Farouk Adeleke Date: Sat, 27 Dec 2025 07:15:49 -0800 Subject: [PATCH] Update README.md --- auto_classes.json | 4 +- config.json | 2 +- main.py => modules.py | 13 +-- program.json | 5 +- pyproject.toml | 2 +- src/__init__.py | 0 src/neo4j.py | 180 ------------------------------------------ 7 files changed, 10 insertions(+), 196 deletions(-) rename main.py => modules.py (91%) delete mode 100644 src/__init__.py delete mode 100644 src/neo4j.py diff --git a/auto_classes.json b/auto_classes.json index 5d1a5e1..52efeb3 100644 --- a/auto_classes.json +++ b/auto_classes.json @@ -1,4 +1,4 @@ { - "AutoConfig": "main.GenerateCypherConfig", - "AutoProgram": "main.GenerateCypher" + "AutoConfig": "modules.GenerateCypherConfig", + "AutoProgram": "modules.GenerateCypher" } \ No newline at end of file diff --git a/config.json b/config.json index 5af9f7d..93fc6ce 100644 --- a/config.json +++ b/config.json @@ -1,4 +1,4 @@ { - "model": "openai/gpt-4o", + "model": "openrouter/openai/gpt-4o", "max_tokens": 1024 } \ No newline at end of file diff --git a/main.py b/modules.py similarity index 91% rename from main.py rename to modules.py index 5cc1adc..a9378ef 100644 --- a/main.py +++ b/modules.py @@ -2,17 +2,9 @@ import os import dspy from dotenv import load_dotenv from modaic import PrecompiledProgram, PrecompiledConfig -from src.neo4j import Neo4j load_dotenv() -# set up Neo4j using NEO4J_URI -neo4j = Neo4j( - uri=os.getenv("NEO4J_URI"), - user=os.getenv("NEO4J_USER"), - password=os.getenv("NEO4J_PASSWORD"), -) - class CypherFromQuestion(dspy.Signature): """Task: Generate Cypher statement to query a graph database. @@ -33,7 +25,7 @@ class CypherFromQuestion(dspy.Signature): class GenerateCypherConfig(PrecompiledConfig): - model: str = "openai/gpt-4o" + model: str = "openrouter/openai/gpt-4o" # OPENROUTER ONLY max_tokens: int = 1024 @@ -45,6 +37,7 @@ class GenerateCypher(PrecompiledProgram): self.lm = dspy.LM( model=config.model, max_tokens=config.max_tokens, + api_base="https://openrouter.ai/api/v1", ) self.generate_cypher = dspy.ChainOfThought(CypherFromQuestion) self.generate_cypher.set_lm(self.lm) @@ -76,6 +69,6 @@ if __name__ == "__main__": generate_cypher.push_to_hub( "farouk1/text-to-cypher", with_code=True, - tag="v0.0.9", + tag="v1.0.0", commit_message="Update README.md", ) diff --git a/program.json b/program.json index 7b80823..91e138d 100644 --- a/program.json +++ b/program.json @@ -25,7 +25,7 @@ ] }, "lm": { - "model": "openai/gpt-4o", + "model": "openrouter/openai/gpt-4o", "model_type": "chat", "cache": true, "num_retries": 3, @@ -33,7 +33,8 @@ "launch_kwargs": {}, "train_kwargs": {}, "temperature": null, - "max_tokens": 1024 + "max_tokens": 1024, + "api_base": "https://openrouter.ai/api/v1" } }, "metadata": { diff --git a/pyproject.toml b/pyproject.toml index 81c1404..07b97ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,4 +4,4 @@ version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.13" -dependencies = ["datasets>=4.4.2", "dspy>=3.0.4", "modaic>=0.8.2", "neo4j~=5.18.0", "python-dotenv~=1.0.1", "sacrebleu>=2.5.1"] +dependencies = ["datasets>=4.4.2", "dspy>=3.0.4", "modaic>=0.8.3", "neo4j~=5.18.0", "python-dotenv~=1.0.1", "sacrebleu>=2.5.1"] diff --git a/src/__init__.py b/src/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/neo4j.py b/src/neo4j.py deleted file mode 100644 index 20953e6..0000000 --- a/src/neo4j.py +++ /dev/null @@ -1,180 +0,0 @@ -import json -import neo4j - - -def parse_relationships(schema: dict) -> str: - # Parse the JSON string into a Python object if it's not already - if isinstance(schema, str): - data = json.loads(schema) - else: - data = schema - - data = data[0]["relationships"] - - # Initialize a list to hold the formatted relationship strings - relationships = [] - - # Iterate through each relationship in the data - for relationship in data: - entity1, relation, entity2 = relationship - # Extract the names of the entities and the relationship - entity1_name = entity1["name"] - entity2_name = entity2["name"] - # Format the string as specified and add it to the list - formatted_relationship = f"{entity1_name}-{relation}->{entity2_name}" - relationships.append(formatted_relationship) - - # Join all formatted strings with a newline character - result = "\n".join(relationships) - return result - - -def parse_nodes(schema): - schema = schema - nodes = [node["name"] for node in schema[0]["nodes"]] - return "\n".join(nodes) - - -def parse_node_properties(node_properties): - # Initialize a dictionary to accumulate node details - node_details = {} - - # Iterate through each item in the input JSON - for item in node_properties: - node_label = item["nodeLabels"][0] # Assuming there's always one label - prop_name = item["propertyName"] - mandatory = "required" if item["mandatory"] else "optional" - - # Prepare the property string - property_str = f"{prop_name} ({mandatory})" if item["mandatory"] else prop_name - - # If the node label exists, append the property; otherwise, create a new entry - if node_label in node_details: - node_details[node_label].append(property_str) - else: - node_details[node_label] = [property_str] - - # Format the output - output_lines = [] - for node, properties in node_details.items(): - output_lines.append(f"{node}") - for prop in properties: - prop_line = f" - {prop}" if "required" in prop else f" - {prop}" - output_lines.append(prop_line) - - return "\n".join(output_lines) - - -def parse_rel_properties(rel_properties): - # Initialize a dictionary to accumulate relationship details - rel_details = {} - - # Iterate through each item in the input JSON - for item in rel_properties: - # Extract relationship type name, removing :` and ` - rel_type = item["relType"][2:].strip("`") - prop_name = item["propertyName"] - mandatory = "required" if item["mandatory"] else "optional" - - # If propertyName is not None, prepare the property string - if prop_name is not None: - property_str = f"{prop_name} ({mandatory})" - # If the relationship type exists, append the property; otherwise, create a new entry - if rel_type in rel_details: - rel_details[rel_type].append(property_str) - else: - rel_details[rel_type] = [property_str] - else: - # For relationships without properties, ensure the relationship is listed - rel_details.setdefault(rel_type, []) - - # Format the output - output_lines = [] - for rel_type, properties in rel_details.items(): - output_lines.append(f"{rel_type}") - for prop in properties: - output_lines.append(f" - {prop}") - - return "\n".join(output_lines) - - -class Neo4j: - def __init__(self, uri, user: str = None, password: str = None): - self._uri = uri - self._user = user - self._password = password - self._auth = ( - None - if (self._user is None and self._password is None) - else (self._user, self._password) - ) - self._driver = neo4j.GraphDatabase.driver( - self._uri, auth=(self._user, self._password) - ) - - self._verify_connection() - print("CONNECTION ESTABLISHED") - - def close(self): - self._driver.close() - print("CONNECTION CLOSED") - - def _verify_connection(self): - with self._driver as driver: - driver.verify_connectivity() - print("CONNECTION VERIFIED") - - def query(self, query, parameters=None, db=None): - assert db is None, ( - "The Neo4j implementation does not support multiple databases." - ) - with self._driver.session(database=db) as session: - result = session.run(query, parameters) - return result.data() - - def schema(self, parsed=False): - query = """ - CALL db.schema.visualization() - """ - schema = self.query(query) - - if parsed: - return parse_nodes(schema), parse_relationships(schema) - - return schema - - def schema_properties(self, parsed=False): - props = self._schema_node_properties(), self._schema_relationship_properties() - if parsed: - return parse_node_properties(props[0]), parse_rel_properties(props[1]) - - return props - - def _schema_node_properties(self): - query = """ - CALL db.schema.nodeTypeProperties() - """ - return self.query(query) - - def _schema_relationship_properties(self): - query = """ - CALL db.schema.relTypeProperties() - """ - return self.query(query) - - def fmt_schema(self): - parsed_schema = self.schema(parsed=True) - parsed_props = self.schema_properties(parsed=True) - parsed = (*parsed_props, parsed_schema[1]) - return "\n".join( - [ - f"{element}:\n{parsed[idx]}\n" - for idx, element in enumerate( - [ - "NODE LABELS & PROPERTIES", - "RELATIONSHIP LABELS & PROPERTIES", - "RELATIONSHIPS", - ] - ) - ] - )