community[patch]: Add the ability to pass maps to neo4j retrieval query (#19758)

Makes it easier to flatten complex values to text, so you don't have to
use a lot of Cypher to do it.
This commit is contained in:
Tomaz Bratanic
2024-03-29 16:33:48 +01:00
committed by GitHub
parent f7e8a382cc
commit dec00d3050
3 changed files with 77 additions and 2 deletions

View File

@@ -108,6 +108,31 @@ def remove_lucene_chars(text: str) -> str:
return text.strip()
def dict_to_yaml_str(input_dict: Dict, indent: int = 0) -> str:
"""
Converts a dictionary to a YAML-like string without using external libraries.
Parameters:
- input_dict (dict): The dictionary to convert.
- indent (int): The current indentation level.
Returns:
- str: The YAML-like string representation of the input dictionary.
"""
yaml_str = ""
for key, value in input_dict.items():
padding = " " * indent
if isinstance(value, dict):
yaml_str += f"{padding}{key}:\n{dict_to_yaml_str(value, indent + 1)}"
elif isinstance(value, list):
yaml_str += f"{padding}{key}:\n"
for item in value:
yaml_str += f"{padding}- {item}\n"
else:
yaml_str += f"{padding}{key}: {value}\n"
return yaml_str
class Neo4jVector(VectorStore):
"""`Neo4j` vector index.
@@ -646,7 +671,9 @@ class Neo4jVector(VectorStore):
docs = [
(
Document(
page_content=result["text"],
page_content=dict_to_yaml_str(result["text"])
if isinstance(result["text"], dict)
else result["text"],
metadata={
k: v for k, v in result["metadata"].items() if v is not None
},