I’m having trouble connecting LangChain to my Neo4j database running in Docker. The connection works fine with regular Neo4j driver but fails when using Neo4jVector.
Background
My setup was working perfectly when I used Neo4j cloud instance. But after switching to a local Docker setup, I keep getting connection refused errors specifically with LangChain’s vector store integration.
What Works
Direct Neo4j connection using the standard driver works without issues:
from neo4j import GraphDatabase
db_uri = "bolt://neo4j_database:7687"
user = "neo4j"
pass_word = "neo4j_admin"
connection = GraphDatabase.driver(db_uri, auth=(user, pass_word))
def insert_historical_data(transaction):
# Adding some historical figures
transaction.run("""
CREATE (gandhi:Leader {name: 'Mahatma Gandhi', role: 'Freedom Fighter', period: '1869-1948'})
CREATE (independence:Movement {name: 'Independence Movement', description: 'Indian freedom struggle', timeline: '1857-1947'})
CREATE (nehru:Leader {name: 'Jawaharlal Nehru', role: 'First Prime Minister', term: '1947-1964'})
CREATE (partition:Event {name: 'Partition of India', description: 'Division of British India', year: 1947})
CREATE (quit_india:Campaign {name: 'Quit India Movement', description: 'Mass protest against British rule', year: 1942})
""")
# Creating connections between entities
transaction.run("""
MATCH (gandhi:Leader {name: 'Mahatma Gandhi'}),
(nehru:Leader {name: 'Jawaharlal Nehru'}),
(independence:Movement {name: 'Independence Movement'}),
(partition:Event {name: 'Partition of India'}),
(quit_india:Campaign {name: 'Quit India Movement'})
CREATE (gandhi)-[:LED]->(independence)
CREATE (gandhi)-[:LAUNCHED]->(quit_india)
CREATE (nehru)-[:PARTICIPATED_IN]->(independence)
CREATE (independence)-[:RESULTED_IN]->(partition)
CREATE (nehru)-[:BECAME_PM_AFTER]->(partition)
""")
try:
with connection.session() as db_session:
db_session.execute_write(insert_historical_data)
print("Historical data inserted successfully!")
print(f"Connected to: {db_uri}")
except Exception as error:
print(f"Database error: {error}")
finally:
connection.close()
What Doesn’t Work
LangChain integration fails with connection refused error:
from langchain_ollama import OllamaEmbeddings
from langchain_community.vectorstores.neo4j_vector import Neo4jVector
import os
from dotenv import load_dotenv
from langchain.schema import Document
load_dotenv()
DATABASE_URI = os.getenv("NEO4J_URL")
db_user = os.getenv("NEO4J_USERNAME")
db_password = os.getenv("NEO4J_PASSWORD")
documents_path = os.getenv("CHUNK_FOLDER_PATH")
vector_index = "embeddings"
text_index = "fulltext"
def load_text_files(folder_path):
documents = []
try:
for file in os.listdir(folder_path):
if file.endswith(".txt"):
full_path = os.path.join(folder_path, file)
with open(full_path, 'r', encoding='utf-8') as f:
text_content = f.read()
documents.append(Document(page_content=text_content, metadata={"source": file}))
except Exception as err:
print(f"Failed to load documents: {err}")
return documents
def setup_vector_store(docs):
try:
embedder = OllamaEmbeddings(model="mxbai-embed-large")
print("Embedding model ready.")
except Exception as err:
print(f"Embedding model error: {err}")
return None
try:
vector_db = Neo4jVector.from_existing_index(
embedding=embedder,
url=DATABASE_URI,
username=db_user,
password=db_password,
search_type="hybrid",
index_name=vector_index,
keyword_index_name=text_index,
node_label=["Document", "Content"],
embedding_node_property="vector",
)
print("Connected to existing vector index.")
return vector_db
except Exception as err:
print(f"Existing index failed, creating new: {err}")
docs = load_text_files(documents_path)
if not docs:
print("No documents available for indexing")
return None
try:
vector_db = Neo4jVector.from_documents(
embedding=embedder,
documents=docs,
url=DATABASE_URI,
username=db_user,
password=db_password,
search_type="hybrid",
index_name=vector_index,
keyword_index_name=text_index,
node_label=["Document", "Content"],
embedding_node_property="vector",
)
print("New vector index created")
return vector_db
except Exception as creation_err:
print(f"Vector index creation failed: {creation_err}")
return None
def search_similar_content(vector_store, search_query):
try:
results = vector_store.similarity_search_with_score(search_query, k=3)
for content, relevance in results:
print(f"Content: {content.page_content}\nRelevance: {relevance}")
except Exception as err:
print(f"Search failed: {err}")
if __name__ == "__main__":
search_term = "Who was the first king"
documents = load_text_files(documents_path)
if documents:
store = setup_vector_store(documents)
if store:
search_similar_content(store, search_term)
Error Message
Embedding model ready.
Vector index creation failed: [Errno 111] Connection refused
Environment Setup
- langchain == 0.3.13
- neo4j == 5.27.0
- langchain_ollama == 0.2.2
Environment variables:
NEO4J_URI=bolt://172.20.0.3:7687
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=neo4j_admin
Neo4j browser works at http://localhost:7474
and bolt connection at bolt://172.20.0.3:7687
.
Why does direct Neo4j driver connection work but LangChain Neo4jVector fails? How can I fix this connection issue in my Docker environment?