From 501c224540e4d4afaadf0071e00eb2a8e2f26ce4 Mon Sep 17 00:00:00 2001 From: Farouk Adeleke Date: Sat, 27 Dec 2025 05:07:01 -0800 Subject: [PATCH] Update README.md --- README.md | 3 --- main.py | 27 +++++++++++++-------------- program.json | 6 +++--- pyproject.toml | 2 +- 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index d42446a..8c9d2b6 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,6 @@ LLM-driven automated knowledge graph construction from text using DSPy and Neo4j ```sh text-to-cypher/ ├── README.md -├── examples/ -│ └── wikipedia-abstracts-v0_0_1.ndjson -├── img/ ├── main.py ├── pyproject.toml ├── uv.lock diff --git a/main.py b/main.py index f74259f..5cc1adc 100644 --- a/main.py +++ b/main.py @@ -14,23 +14,22 @@ neo4j = Neo4j( ) -class CypherFromText(dspy.Signature): - """Task: Generate Cypher statement to query a graph database. - Instructions: Use only the provided relationship types and properties in the schema. - Do not use any other relationship types or properties that are not provided in the schema. - Do not include any explanations or apologies in your responses. - Do not respond to any questions that might ask anything else than for you to construct a Cypher statement. +class CypherFromQuestion(dspy.Signature): + """Task: Generate Cypher statement to query a graph database. + Instructions: Use only the provided relationship types and properties in the schema. + Do not use any other relationship types or properties that are not provided in the schema. + Do not include any explanations or apologies in your responses. + Do not respond to any questions that might ask anything else than for you to construct a Cypher statement. Do not include any text except the generated Cypher statement. """ + question = dspy.InputField( - desc="Question to model using a cypher statement." + desc="Question to model using a cypher statement. Use only the provided relationship types and properties in the schema." ) neo4j_schema = dspy.InputField( desc="Current graph schema in Neo4j as a list of NODES and RELATIONSHIPS." ) - statement = dspy.OutputField( - desc="Cypher statement to merge nodes and relationships found in the text." - ) + statement = dspy.OutputField(desc="Cypher statement to query the graph database.") class GenerateCypherConfig(PrecompiledConfig): @@ -47,11 +46,11 @@ class GenerateCypher(PrecompiledProgram): model=config.model, max_tokens=config.max_tokens, ) - self.generate_cypher = dspy.ChainOfThought(CypherFromText) + self.generate_cypher = dspy.ChainOfThought(CypherFromQuestion) self.generate_cypher.set_lm(self.lm) - def forward(self, text: str, neo4j_schema: list[str]): - return self.generate_cypher(text=text, neo4j_schema=neo4j_schema) + def forward(self, question: str, neo4j_schema: list[str]): + return self.generate_cypher(question=question, neo4j_schema=neo4j_schema) generate_cypher = GenerateCypher(GenerateCypherConfig()) @@ -77,6 +76,6 @@ if __name__ == "__main__": generate_cypher.push_to_hub( "farouk1/text-to-cypher", with_code=True, - tag="v0.0.8", + tag="v0.0.9", commit_message="Update README.md", ) diff --git a/program.json b/program.json index 4746505..7b80823 100644 --- a/program.json +++ b/program.json @@ -4,11 +4,11 @@ "train": [], "demos": [], "signature": { - "instructions": "Task: Generate Cypher statement to query a graph database. \nInstructions: Use only the provided relationship types and properties in the schema. \nDo not use any other relationship types or properties that are not provided in the schema. \nDo not include any explanations or apologies in your responses. \nDo not respond to any questions that might ask anything else than for you to construct a Cypher statement. \nDo not include any text except the generated Cypher statement.", + "instructions": "Task: Generate Cypher statement to query a graph database.\nInstructions: Use only the provided relationship types and properties in the schema.\nDo not use any other relationship types or properties that are not provided in the schema.\nDo not include any explanations or apologies in your responses.\nDo not respond to any questions that might ask anything else than for you to construct a Cypher statement.\nDo not include any text except the generated Cypher statement.", "fields": [ { "prefix": "Question:", - "description": "Question to model using a cypher statement." + "description": "Question to model using a cypher statement. Use only the provided relationship types and properties in the schema." }, { "prefix": "Neo 4 J Schema:", @@ -20,7 +20,7 @@ }, { "prefix": "Statement:", - "description": "Cypher statement to merge nodes and relationships found in the text." + "description": "Cypher statement to query the graph database." } ] }, diff --git a/pyproject.toml b/pyproject.toml index 0e045c5..81c1404 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"] +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"]