Skip to content

Commit 18963b2

Browse files
authored
Added created_at:datetime on the :Session and :Message node (#349)
* Added created_at:datetime on the :Session and :Message node * Changed property from created_at to createdAt + ran ruff format . * Ruff through peotry conf
1 parent cfca407 commit 18963b2

File tree

10 files changed

+25
-34
lines changed

10 files changed

+25
-34
lines changed

examples/customize/build_graph/pipeline/pipeline_streaming.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ async def run_with_context(self, context_: RunContext, value: int) -> OutputMode
2222
for i in range(value):
2323
await asyncio.sleep(0.5) # Simulate work
2424
await context_.notify(
25-
message=f"Added {i+1}/{value}", data={"current": i + 1, "total": value}
25+
message=f"Added {i + 1}/{value}",
26+
data={"current": i + 1, "total": value},
2627
)
2728
return OutputModel(result=value + self.number)
2829

@@ -38,7 +39,8 @@ async def run_with_context(self, context_: RunContext, value: int) -> OutputMode
3839
for i in range(3): # Always do 3 steps
3940
await asyncio.sleep(0.7) # Simulate work
4041
await context_.notify(
41-
message=f"Multiplication step {i+1}/3", data={"step": i + 1, "total": 3}
42+
message=f"Multiplication step {i + 1}/3",
43+
data={"step": i + 1, "total": 3},
4244
)
4345
return OutputModel(result=value * self.multiplier)
4446

examples/customize/retrievers/hybrid_retrievers/hybrid_cypher_search.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def embed_query(self, text: str) -> list[float]:
4040
)
4141

4242
# Initialize the retriever
43-
retrieval_query = "MATCH (node)-[:AUTHORED_BY]->(author:Author)" "RETURN author.name"
43+
retrieval_query = "MATCH (node)-[:AUTHORED_BY]->(author:Author)RETURN author.name"
4444
retriever = HybridCypherRetriever(
4545
driver, INDEX_NAME, FULLTEXT_INDEX_NAME, retrieval_query, embedder
4646
)

examples/question_answering/graphrag.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131

3232
def formatter(record: neo4j.Record) -> RetrieverResultItem:
33-
return RetrieverResultItem(content=f'{record.get("title")}: {record.get("plot")}')
33+
return RetrieverResultItem(content=f"{record.get('title')}: {record.get('plot')}")
3434

3535

3636
driver = neo4j.GraphDatabase.driver(

src/neo4j_graphrag/experimental/components/neo4j_reader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def _get_query(
7474
return_properties.append(f"{embedding_property}: null")
7575
query = (
7676
f"MATCH (c:`{chunk_label}`) "
77-
f"RETURN c {{ { ', '.join(return_properties) } }} as chunk "
77+
f"RETURN c {{ {', '.join(return_properties)} }} as chunk "
7878
)
7979
if index_property:
8080
query += f"ORDER BY c.{index_property}"

src/neo4j_graphrag/filters.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,7 @@ def _handle_field_filter(
255255

256256
if field.startswith(OPERATOR_PREFIX):
257257
raise FilterValidationError(
258-
f"Invalid filter condition. Expected a field but got an operator: "
259-
f"{field}"
258+
f"Invalid filter condition. Expected a field but got an operator: {field}"
260259
)
261260

262261
if isinstance(value, dict):
@@ -273,8 +272,7 @@ def _handle_field_filter(
273272
# Verify that that operator is an operator
274273
if operator not in SUPPORTED_OPERATORS:
275274
raise FilterValidationError(
276-
f"Invalid operator: {operator}. "
277-
f"Expected one of {SUPPORTED_OPERATORS}"
275+
f"Invalid operator: {operator}. Expected one of {SUPPORTED_OPERATORS}"
278276
)
279277
else: # if value is not dict, then we assume an equality operator
280278
operator = OPERATOR_EQ
@@ -344,10 +342,7 @@ def _construct_metadata_filter(
344342
else:
345343
raise FilterValidationError(f"Unsupported operator: {key}")
346344
query = cypher_operator.join(
347-
[
348-
f"({ _construct_metadata_filter(el, param_store, node_alias)})"
349-
for el in value
350-
]
345+
[f"({_construct_metadata_filter(el, param_store, node_alias)})" for el in value]
351346
)
352347
return query
353348

src/neo4j_graphrag/message_history.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
Neo4jMessageHistoryModel,
2626
)
2727

28-
CREATE_SESSION_NODE_QUERY = "MERGE (s:`{node_label}` {{id:$session_id}})"
28+
CREATE_SESSION_NODE_QUERY = (
29+
"MERGE (s:`{node_label}` {{id:$session_id, createdAt: datetime()}})"
30+
)
2931

3032
DELETE_SESSION_AND_MESSAGES_QUERY = (
3133
"MATCH (s:`{node_label}`) "
@@ -56,7 +58,7 @@
5658
"MATCH (s:`{node_label}`) WHERE s.id = $session_id "
5759
"OPTIONAL MATCH (s)-[lm:LAST_MESSAGE]->(last_message) "
5860
"CREATE (s)-[:LAST_MESSAGE]->(new:Message) "
59-
"SET new += {{role:$role, content:$content}} "
61+
"SET new += {{role:$role, content:$content, createdAt: datetime()}} "
6062
"WITH new, lm, last_message WHERE last_message IS NOT NULL "
6163
"CREATE (last_message)-[:NEXT]->(new) "
6264
"DELETE lm"

src/neo4j_graphrag/schema.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ def _format_property(prop: Dict[str, Any]) -> Optional[str]:
385385
else:
386386
return (
387387
"Available options: "
388-
+ f'{[_clean_string_values(el) for el in prop["values"]]}'
388+
+ f"{[_clean_string_values(el) for el in prop['values']]}"
389389
)
390390
elif prop["type"] in [
391391
"INTEGER",
@@ -395,14 +395,14 @@ def _format_property(prop: Dict[str, Any]) -> Optional[str]:
395395
"LOCAL_DATE_TIME",
396396
]:
397397
if prop.get("min") and prop.get("max"):
398-
return f'Min: {prop["min"]}, Max: {prop["max"]}'
398+
return f"Min: {prop['min']}, Max: {prop['max']}"
399399
else:
400400
return f'Example: "{prop["values"][0]}"' if prop.get("values") else ""
401401
elif prop["type"] == "LIST":
402402
if not prop.get("min_size") or prop["min_size"] > LIST_LIMIT:
403403
return None
404404
else:
405-
return f'Min Size: {prop["min_size"]}, Max Size: {prop["max_size"]}'
405+
return f"Min Size: {prop['min_size']}, Max Size: {prop['max_size']}"
406406
return ""
407407

408408

@@ -551,7 +551,7 @@ def _build_str_clauses(
551551
sanitize=sanitize,
552552
)[0]["value"]
553553
return_clauses.append(
554-
(f"values: {distinct_values}," f" distinct_count: {len(distinct_values)}")
554+
(f"values: {distinct_values}, distinct_count: {len(distinct_values)}")
555555
)
556556
else:
557557
with_clauses.append(
@@ -595,7 +595,7 @@ def _build_list_clauses(prop_name: str) -> Tuple[str, str]:
595595
)
596596

597597
return_clause = (
598-
f"min_size: `{prop_name}_size_min`, " f"max_size: `{prop_name}_size_max`"
598+
f"min_size: `{prop_name}_size_min`, max_size: `{prop_name}_size_max`"
599599
)
600600
return with_clause, return_clause
601601

@@ -630,7 +630,7 @@ def _build_num_date_clauses(
630630
return_clauses = []
631631
if not prop_index and not exhaustive:
632632
with_clauses.append(
633-
f"collect(distinct toString(n.`{prop_name}`)) " f"AS `{prop_name}_values`"
633+
f"collect(distinct toString(n.`{prop_name}`)) AS `{prop_name}_values`"
634634
)
635635
return_clauses.append(f"values: `{prop_name}_values`")
636636
else:

tests/e2e/retrievers/test_hybrid_e2e.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,7 @@ def test_hybrid_retriever_no_neo4j_deprecation_warning(
7676
def test_hybrid_cypher_retriever_search_text(
7777
driver: Driver, random_embedder: Embedder
7878
) -> None:
79-
retrieval_query = (
80-
"MATCH (node)-[:AUTHORED_BY]->(author:Author) " "RETURN author.name"
81-
)
79+
retrieval_query = "MATCH (node)-[:AUTHORED_BY]->(author:Author) RETURN author.name"
8280
retriever = HybridCypherRetriever(
8381
driver,
8482
"vector-index-name",
@@ -127,9 +125,7 @@ def test_hybrid_retriever_search_vector(driver: Driver) -> None:
127125

128126
@pytest.mark.usefixtures("setup_neo4j_for_retrieval")
129127
def test_hybrid_cypher_retriever_search_vector(driver: Driver) -> None:
130-
retrieval_query = (
131-
"MATCH (node)-[:AUTHORED_BY]->(author:Author) " "RETURN author.name"
132-
)
128+
retrieval_query = "MATCH (node)-[:AUTHORED_BY]->(author:Author) RETURN author.name"
133129
retriever = HybridCypherRetriever(
134130
driver,
135131
"vector-index-name",

tests/e2e/retrievers/test_vector_e2e.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,7 @@ def test_vector_retriever_search_text(
4545
def test_vector_cypher_retriever_search_text(
4646
driver: Driver, random_embedder: Embedder
4747
) -> None:
48-
retrieval_query = (
49-
"MATCH (node)-[:AUTHORED_BY]->(author:Author) " "RETURN author.name"
50-
)
48+
retrieval_query = "MATCH (node)-[:AUTHORED_BY]->(author:Author) RETURN author.name"
5149
retriever = VectorCypherRetriever(
5250
driver, "vector-index-name", retrieval_query, random_embedder
5351
)
@@ -88,9 +86,7 @@ def test_vector_retriever_search_vector(driver: Driver) -> None:
8886

8987
@pytest.mark.usefixtures("setup_neo4j_for_retrieval")
9088
def test_vector_cypher_retriever_search_vector(driver: Driver) -> None:
91-
retrieval_query = (
92-
"MATCH (node)-[:AUTHORED_BY]->(author:Author) " "RETURN author.name"
93-
)
89+
retrieval_query = "MATCH (node)-[:AUTHORED_BY]->(author:Author) RETURN author.name"
9490
retriever = VectorCypherRetriever(driver, "vector-index-name", retrieval_query)
9591

9692
top_k = 5

tests/unit/test_schema.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ def test_format_schema(
833833
True,
834834
5,
835835
False,
836-
("MATCH (n:`Journey`)\n" "RETURN {} AS output"),
836+
("MATCH (n:`Journey`)\nRETURN {} AS output"),
837837
),
838838
(
839839
"Non-exhaustive, duration property",

0 commit comments

Comments
 (0)