LangChain OpenTutorial
  • 🦜️🔗 The LangChain Open Tutorial for Everyone
  • 01-Basic
    • Getting Started on Windows
    • 02-Getting-Started-Mac
    • OpenAI API Key Generation and Testing Guide
    • LangSmith Tracking Setup
    • Using the OpenAI API (GPT-4o Multimodal)
    • Basic Example: Prompt+Model+OutputParser
    • LCEL Interface
    • Runnable
  • 02-Prompt
    • Prompt Template
    • Few-Shot Templates
    • LangChain Hub
    • Personal Prompts for LangChain
    • Prompt Caching
  • 03-OutputParser
    • PydanticOutputParser
    • PydanticOutputParser
    • CommaSeparatedListOutputParser
    • Structured Output Parser
    • JsonOutputParser
    • PandasDataFrameOutputParser
    • DatetimeOutputParser
    • EnumOutputParser
    • Output Fixing Parser
  • 04-Model
    • Using Various LLM Models
    • Chat Models
    • Caching
    • Caching VLLM
    • Model Serialization
    • Check Token Usage
    • Google Generative AI
    • Huggingface Endpoints
    • HuggingFace Local
    • HuggingFace Pipeline
    • ChatOllama
    • GPT4ALL
    • Video Q&A LLM (Gemini)
  • 05-Memory
    • ConversationBufferMemory
    • ConversationBufferWindowMemory
    • ConversationTokenBufferMemory
    • ConversationEntityMemory
    • ConversationKGMemory
    • ConversationSummaryMemory
    • VectorStoreRetrieverMemory
    • LCEL (Remembering Conversation History): Adding Memory
    • Memory Using SQLite
    • Conversation With History
  • 06-DocumentLoader
    • Document & Document Loader
    • PDF Loader
    • WebBaseLoader
    • CSV Loader
    • Excel File Loading in LangChain
    • Microsoft Word(doc, docx) With Langchain
    • Microsoft PowerPoint
    • TXT Loader
    • JSON
    • Arxiv Loader
    • UpstageDocumentParseLoader
    • LlamaParse
    • HWP (Hangeul) Loader
  • 07-TextSplitter
    • Character Text Splitter
    • 02. RecursiveCharacterTextSplitter
    • Text Splitting Methods in NLP
    • TokenTextSplitter
    • SemanticChunker
    • Split code with Langchain
    • MarkdownHeaderTextSplitter
    • HTMLHeaderTextSplitter
    • RecursiveJsonSplitter
  • 08-Embedding
    • OpenAI Embeddings
    • CacheBackedEmbeddings
    • HuggingFace Embeddings
    • Upstage
    • Ollama Embeddings With Langchain
    • LlamaCpp Embeddings With Langchain
    • GPT4ALL
    • Multimodal Embeddings With Langchain
  • 09-VectorStore
    • Vector Stores
    • Chroma
    • Faiss
    • Pinecone
    • Qdrant
    • Elasticsearch
    • MongoDB Atlas
    • PGVector
    • Neo4j
    • Weaviate
    • Faiss
    • {VectorStore Name}
  • 10-Retriever
    • VectorStore-backed Retriever
    • Contextual Compression Retriever
    • Ensemble Retriever
    • Long Context Reorder
    • Parent Document Retriever
    • MultiQueryRetriever
    • MultiVectorRetriever
    • Self-querying
    • TimeWeightedVectorStoreRetriever
    • TimeWeightedVectorStoreRetriever
    • Kiwi BM25 Retriever
    • Ensemble Retriever with Convex Combination (CC)
  • 11-Reranker
    • Cross Encoder Reranker
    • JinaReranker
    • FlashRank Reranker
  • 12-RAG
    • Understanding the basic structure of RAG
    • RAG Basic WebBaseLoader
    • Exploring RAG in LangChain
    • RAPTOR: Recursive Abstractive Processing for Tree-Organized Retrieval
    • Conversation-With-History
    • Translation
    • Multi Modal RAG
  • 13-LangChain-Expression-Language
    • RunnablePassthrough
    • Inspect Runnables
    • RunnableLambda
    • Routing
    • Runnable Parallel
    • Configure-Runtime-Chain-Components
    • Creating Runnable objects with chain decorator
    • RunnableWithMessageHistory
    • Generator
    • Binding
    • Fallbacks
    • RunnableRetry
    • WithListeners
    • How to stream runnables
  • 14-Chains
    • Summarization
    • SQL
    • Structured Output Chain
    • StructuredDataChat
  • 15-Agent
    • Tools
    • Bind Tools
    • Tool Calling Agent
    • Tool Calling Agent with More LLM Models
    • Iteration-human-in-the-loop
    • Agentic RAG
    • CSV/Excel Analysis Agent
    • Agent-with-Toolkits-File-Management
    • Make Report Using RAG, Web searching, Image generation Agent
    • TwoAgentDebateWithTools
    • React Agent
  • 16-Evaluations
    • Generate synthetic test dataset (with RAGAS)
    • Evaluation using RAGAS
    • HF-Upload
    • LangSmith-Dataset
    • LLM-as-Judge
    • Embedding-based Evaluator(embedding_distance)
    • LangSmith Custom LLM Evaluation
    • Heuristic Evaluation
    • Compare experiment evaluations
    • Summary Evaluators
    • Groundedness Evaluation
    • Pairwise Evaluation
    • LangSmith Repeat Evaluation
    • LangSmith Online Evaluation
    • LangFuse Online Evaluation
  • 17-LangGraph
    • 01-Core-Features
      • Understanding Common Python Syntax Used in LangGraph
      • Title
      • Building a Basic Chatbot with LangGraph
      • Building an Agent with LangGraph
      • Agent with Memory
      • LangGraph Streaming Outputs
      • Human-in-the-loop
      • LangGraph Manual State Update
      • Asking Humans for Help: Customizing State in LangGraph
      • DeleteMessages
      • DeleteMessages
      • LangGraph ToolNode
      • LangGraph ToolNode
      • Branch Creation for Parallel Node Execution
      • Conversation Summaries with LangGraph
      • Conversation Summaries with LangGraph
      • LangGrpah Subgraph
      • How to transform the input and output of a subgraph
      • LangGraph Streaming Mode
      • Errors
      • A Long-Term Memory Agent
    • 02-Structures
      • LangGraph-Building-Graphs
      • Naive RAG
      • Add Groundedness Check
      • Adding a Web Search Module
      • LangGraph-Add-Query-Rewrite
      • Agentic RAG
      • Adaptive RAG
      • Multi-Agent Structures (1)
      • Multi Agent Structures (2)
    • 03-Use-Cases
      • LangGraph Agent Simulation
      • Meta Prompt Generator based on User Requirements
      • CRAG: Corrective RAG
      • Plan-and-Execute
      • Multi Agent Collaboration Network
      • Multi Agent Collaboration Network
      • Multi-Agent Supervisor
      • 08-LangGraph-Hierarchical-Multi-Agent-Teams
      • 08-LangGraph-Hierarchical-Multi-Agent-Teams
      • SQL-Agent
      • 10-LangGraph-Research-Assistant
      • LangGraph Code Assistant
      • Deploy on LangGraph Cloud
      • Tree of Thoughts (ToT)
      • Ollama Deep Researcher (Deepseek-R1)
      • Functional API
      • Reflection in LangGraph
  • 19-Cookbook
    • 01-SQL
      • TextToSQL
      • SpeechToSQL
    • 02-RecommendationSystem
      • ResumeRecommendationReview
    • 03-GraphDB
      • Movie QA System with Graph Database
      • 05-TitanicQASystem
      • Real-Time GraphRAG QA
    • 04-GraphRAG
      • Academic Search System
      • Academic QA System with GraphRAG
    • 05-AIMemoryManagementSystem
      • ConversationMemoryManagementSystem
    • 06-Multimodal
      • Multimodal RAG
      • Shopping QnA
    • 07-Agent
      • 14-MoARAG
      • CoT Based Smart Web Search
      • 16-MultiAgentShoppingMallSystem
      • Agent-Based Dynamic Slot Filling
      • Code Debugging System
      • New Employee Onboarding Chatbot
      • 20-LangGraphStudio-MultiAgent
      • Multi-Agent Scheduler System
    • 08-Serving
      • FastAPI Serving
      • Sending Requests to Remote Graph Server
      • Building a Agent API with LangServe: Integrating Currency Exchange and Trip Planning
    • 08-SyntheticDataset
      • Synthetic Dataset Generation using RAG
    • 09-Monitoring
      • Langfuse Selfhosting
Powered by GitBook
On this page
  • Overview
  • Table of Contents
  • References
  • Environment Setup
  • Connect to Neo4j Graph Database
  • Activate Database
  • Setup APOC Plugin
  • Define Neo4j Credentials
  • Graph Schema
  • GraphQACypherChain
  • Using a New Dataset
  • Create a New Local DBMS
  • Define Neo4j Credentials
  • Download a New Dataset: Kaggle's The Movies Dataset
  1. 19-Cookbook
  2. 03-GraphDB

Movie QA System with Graph Database

Previous03-GraphDBNext05-TitanicQASystem

Last updated 28 days ago

  • Author:

  • Peer Review: ,

  • Proofread :

  • This is a part of

Overview

This tutorial covers the implementation of a movie QA system using a graph database with Neo4j .

It explains the process of storing data in a graph database and implementing a text2Cypher conversion feature using LLMs. This allows natural language queries to be converted into Cypher queries, and the answers retrieved from the database are returned in natural language as well.

⚠️Security Note

Table of Contents

References


Environment Setup

[Note]

  • langchain-opentutorial is a package that provides a set of easy-to-use environment setup, useful functions and utilities for tutorials.

%%capture --no-stderr
%pip install langchain-opentutorial
# Install required packages
from langchain_opentutorial import package

package.install(
    [
        "langchain",
        "langchain_neo4j",
        "langchain_openai",
        "kagglehub",
        "ipywidgets",
    ],
    verbose=False,
    upgrade=False,
)
# Set environment variables
from langchain_opentutorial import set_env

set_env(
    {
        "OPENAI_API_KEY": "",
        "NEO4J_URI": "",
        "NEO4J_USERNAME": "",
        "NEO4J_PASSWORD": "",
        "LANGCHAIN_API_KEY": "",
        "LANGCHAIN_TRACING_V2": "true",
        "LANGCHAIN_ENDPOINT": "https://api.smith.langchain.com",
        "LANGCHAIN_PROJECT": "04-MovieQASystem",
    }
)

You can alternatively set API keys such as OPENAI_API_KEY in a .env file and load them.

[Note] This is not necessary if you've already set the required API keys in previous steps.

# Load API keys from .env file
from dotenv import load_dotenv

load_dotenv(override=True)
True

Connect to Neo4j Graph Database

First, install the Neo4j graph database. This tutorial is based on Neo4j Desktop .

After installing, open Neo4j Desktop. A default Example Project should be available. We'll use this project for this tutorial.

Activate Database

Click the Start to activate the Movie DBMS .

Setup APOC Plugin

  • Open the Movie DBMS project.

  • Go to the Plugins section.

  • Select APOC and click Install and Restart .

To allow external network connections, you need to update the neo4j.conf file.

Open the terminal in Neo4j Desktop .

Navigate to the configuration file directory and edit neo4j.conf .

# Change Directory
cd conf
# Windows
notepad neo4j.conf
# Linux/Mac
nano neo4j.conf

Add or modify the following line in the neo4j.conf file:

  • server.default_listen_address=0.0.0.0

Define Neo4j Credentials

Next, you need to define your Neo4j credentials. If you haven't done this in the previous steps, you can define them using the os package.

[Note] This is not necessary if you've already set the required Neo4j credentials in previous steps.

The default user account information:

  • Default username: neo4j

  • Default password: neo4j

You are required to change the password upon your first login.

import os

os.environ["NEO4J_URI"] = "bolt://localhost:7687"
os.environ["NEO4J_USERNAME"] = "neo4j"
os.environ["NEO4J_PASSWORD"] = "neo4j"

The following example demonstrates how to connect to a Neo4j database and populate it with sample data about movies and actors.

from langchain_neo4j import Neo4jGraph

graph = Neo4jGraph()

# Step 1: Delete all existing data
delete_query = """
MATCH (n)
DETACH DELETE n
"""
graph.query(delete_query)

# Step 2: Load new movie dataset
movies_query = """
LOAD CSV WITH HEADERS FROM 
'https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/movies/movies_small.csv'
AS row
MERGE (m:Movie {id:row.movieId})
SET m.released = date(row.released),
    m.title = row.title,
    m.imdbRating = toFloat(row.imdbRating)
FOREACH (director in split(row.director, '|') | 
    MERGE (p:Person {name:trim(director)})
    MERGE (p)-[:DIRECTED]->(m))
FOREACH (actor in split(row.actors, '|') | 
    MERGE (p:Person {name:trim(actor)})
    MERGE (p)-[:ACTED_IN]->(m))
FOREACH (genre in split(row.genres, '|') | 
    MERGE (g:Genre {name:trim(genre)})
    MERGE (m)-[:IN_GENRE]->(g))
"""

graph.query(movies_query)
[]

Graph Schema

LLMs use graph schema information to convert natural language questions into Cypher queries. The converted query is executed in the database, and the execution results are provied to the LLM for question answering.

# Update schema
graph.refresh_schema()
# Print the current schema
print(graph.schema)
Node properties:
    Movie {title: STRING, released: DATE, id: STRING, imdbRating: FLOAT}
    Person {name: STRING}
    Genre {name: STRING}
    Relationship properties:
    
    The relationships:
    (:Movie)-[:IN_GENRE]->(:Genre)
    (:Person)-[:DIRECTED]->(:Movie)
    (:Person)-[:ACTED_IN]->(:Movie)

Now, let's check the enhanced schema information. Enhanced Schema Information provides a detailed overview of the graph structure, including node labels, relationship types, and property details such as data types and value ranges. This is particularly useful for generating more complex queries and leveraging LLMs for advanced use cases.

To enable Enhanced Schema, set the parameter enhanced_schema=True when initializing the graph object.

Key Features:

  • Property Types : Shows the data type (e.g., STRING, INTEGER, FLOAT) of each property.

  • Value Ranges : Displays minimum and maximum values for numeric fields.

  • Examples : Provides sample values for quick reference.

  • Relationships : Lists connection types between nodes and their property details.

enhanced_graph = Neo4jGraph(enhanced_schema=True)
print(enhanced_graph.schema)
Received notification from DBMS server: {severity: WARNING} {code: Neo.ClientNotification.Statement.FeatureDeprecationWarning} {category: DEPRECATION} {title: This feature is deprecated and will be removed in future versions.} {description: The procedure has a deprecated field. ('config' used by 'apoc.meta.graphSample' is deprecated.)} {position: line: 1, column: 1, offset: 0} for query: "CALL apoc.meta.graphSample() YIELD nodes, relationships RETURN nodes, [rel in relationships | {name:apoc.any.property(rel, 'type'), count: apoc.any.property(rel, 'count')}] AS relationships"
Node properties:
- **Movie**
  - `title`: STRING Example: "Toy Story"
  - `released`: DATE Min: 1964-12-16, Max: 1996-09-15
  - `id`: STRING Example: "1"
  - `imdbRating`: FLOAT Min: 2.4, Max: 9.3
- **Person**
  - `name`: STRING Example: "John Lasseter"
- **Genre**
  - `name`: STRING Example: "Adventure"
Relationship properties:

The relationships:
(:Movie)-[:IN_GENRE]->(:Genre)
(:Person)-[:DIRECTED]->(:Movie)
(:Person)-[:ACTED_IN]->(:Movie)

GraphQACypherChain

The GraphCypherQAChain simplifies the process of querying graph databases using natural language by integrating LLMs and Neo4j. It enables users to interact with graph data through natural language queries by converting them into Cypher queries, which are executed against a Neo4j database.

Key Features:

  • Text-to-Cypher Conversion : Automatically translates natural language questions into Cypher queries.

  • Query Execution : Executes the generated queries against a Neo4j graph database.

  • Natural Language Answers : Processes and formats query results into human-readable answers.

  • LLM Integration : Leverages Large Language Models (LLMs), like OpenAI’s GPT, for query generation and result interpretation.

  • Enhanced Schema Support : Can work with enhanced schema information for more accurate query generation.

from langchain_neo4j import GraphCypherQAChain
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o", temperature=0)
chain = GraphCypherQAChain.from_llm(
    graph=enhanced_graph, llm=llm, verbose=True, allow_dangerous_requests=True
)
response = chain.invoke({"query": "What was the cast of the Casino?"})
response
    
    > Entering new GraphCypherQAChain chain...
    Generated Cypher:
    cypher
    MATCH (p:Person)-[:ACTED_IN]->(m:Movie {title: "Casino"})
    RETURN p.name
    
    Full Context:
    [{'p.name': 'Robert De Niro'}, {'p.name': 'Joe Pesci'}, {'p.name': 'Sharon Stone'}, {'p.name': 'James Woods'}]
    
    > Finished chain.
{'query': 'What was the cast of the Casino?',
 'result': 'Robert De Niro, Joe Pesci, Sharon Stone, and James Woods were the cast of Casino.'}
response = chain.invoke({"query": "Recommend the popular romance movie."})
response
    
    > Entering new GraphCypherQAChain chain...
    Generated Cypher:
    cypher
    MATCH (m:Movie)-[:IN_GENRE]->(g:Genre {name: "Romance"})
    RETURN m.title, m.imdbRating
    ORDER BY m.imdbRating DESC
    LIMIT 1
    
    Full Context:
    [{'m.title': 'Chungking Express (Chung Hing sam lam)', 'm.imdbRating': 8.1}]
    
    > Finished chain.
{'query': 'Recommend the popular romance movie.',
 'result': 'Chungking Express (Chung Hing sam lam) with an IMDb rating of 8.1 is a popular romance movie.'}

Using a New Dataset

To begin, we'll set up a new local DBMS to import and use this external dataset.

Create a New Local DBMS

Refer to the images below to create a new Local DBMS named Kaggle Movie DBMS :

Next, connect to the Neo4j Graph Database as previously explained.

Define Neo4j Credentials

Next, you need to define your Neo4j credentials. If you haven't done this in the previous steps, you can define them using the os package.

To import the dataset, you need to set the import path environment variable. In the image below, you can check the import path by clicking the import button. This path is where you will download and store the dataset.

[Note] This is not necessary if you've already set the required Neo4j credentials in previous steps.

from langchain_neo4j import Neo4jGraph
import os

os.environ["NEO4J_URI"] = "bolt://localhost:7687"
os.environ["NEO4J_USERNAME"] = "neo4j"
os.environ["NEO4J_PASSWORD"] = "neo4j"
os.environ["IMPORT_DIR"] = "YOUR_IMPORT_DIR"

graph = Neo4jGraph()

Download a New Dataset: Kaggle's The Movies Dataset

Download the Kaggle dataset and move it to the import path .

import kagglehub
import shutil

# Download the Kaggle dataset
path = kagglehub.dataset_download("rounakbanik/the-movies-dataset")

print("Path to dataset files:", path)
print("*" * 30)

# Target path where the dataset files will be moved
target_path = os.environ.get("IMPORT_DIR")
os.makedirs(target_path, exist_ok=True)

# Move dataset files to the target path
for file_name in os.listdir(path):
    shutil.move(os.path.join(path, file_name), os.path.join(target_path, file_name))

print("Files moved to:", target_path)
Downloading from https://www.kaggle.com/api/v1/datasets/download/rounakbanik/the-movies-dataset?dataset_version_number=7...
100%|██████████| 228M/228M [00:08<00:00, 26.7MB/s] 

Extracting files...





Path to dataset files: C:\Users\user\.cache\kagglehub\datasets\rounakbanik\the-movies-dataset\versions\7
******************************
Files moved to: C:\Users\user\.Neo4jDesktop\relate-data\dbmss\dbms-a942a090-d1b1-4a85-aef4-bbcc4186d101\import

Below is a simple example code that connects to a Neo4j database and populates it with a portion of the downloaded dataset:

movies_query = f"""
LOAD CSV WITH HEADERS FROM 'file:///movies_metadata.csv' AS row
MERGE (m:Movie {{id: row.id}})
SET m.title = row.title,
    m.popularity = toFloat(row.popularity)
"""
graph.query(movies_query)
[]
keywords_query = f"""
CALL apoc.periodic.iterate(
    "LOAD CSV WITH HEADERS FROM 'file:///keywords.csv' AS row RETURN row",
    "WITH row, apoc.convert.fromJsonList(row.keywords) AS keywords
     UNWIND keywords AS keyword
     MERGE (k:Keyword {{name: keyword.name}})
     MERGE (m:Movie {{id: row.id}})
     MERGE (m)-[:HAS_KEYWORD]->(k)",
    {{batchSize: 1000, parallel: true}}
)
"""
graph.query(keywords_query)
[{'batches': 47,
      'total': 46419,
      'timeTaken': 611,
      'committedOperations': 9000,
      'failedOperations': 37419,
      'failedBatches': 38,
      'retries': 0,
      'errorMessages': {"ForsetiClient[transactionId=63, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=63, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=63, clientId=17],ForsetiClient[transactionId=56, clientId=11]]]": 1,
       "ForsetiClient[transactionId=71, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=69, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=71, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[69] waits for [ForsetiClient[transactionId=71, clientId=17]]]": 1,
       "ForsetiClient[transactionId=74, clientId=15] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=69, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=74, clientId=15].\r\n Wait list:ExclusiveLock[\r\nClient[69] waits for [ForsetiClient[transactionId=74, clientId=15]]]": 1,
       "ForsetiClient[transactionId=66, clientId=18] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(48126) because holders of that lock are waiting for ForsetiClient[transactionId=66, clientId=18].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=66, clientId=18]]]": 1,
       "ForsetiClient[transactionId=68, clientId=6] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=69, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(46494) because holders of that lock are waiting for ForsetiClient[transactionId=68, clientId=6].\r\n Wait list:ExclusiveLock[\r\nClient[69] waits for [ForsetiClient[transactionId=68, clientId=6]]]": 1,
       "ForsetiClient[transactionId=46, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(48158) because holders of that lock are waiting for ForsetiClient[transactionId=46, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=46, clientId=16],ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=49, clientId=18],ForsetiClient[transactionId=-1, clientId=6]]]": 1,
       "ForsetiClient[transactionId=29, clientId=6] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(46076) because holders of that lock are waiting for ForsetiClient[transactionId=29, clientId=6].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=-1, clientId=18],ForsetiClient[transactionId=29, clientId=6]]]": 1,
       "ForsetiClient[transactionId=30, clientId=7] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(53312) because holders of that lock are waiting for ForsetiClient[transactionId=30, clientId=7].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=30, clientId=7]]]": 1,
       "ForsetiClient[transactionId=44, clientId=18] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(46076) because holders of that lock are waiting for ForsetiClient[transactionId=44, clientId=18].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=44, clientId=18],ForsetiClient[transactionId=-1, clientId=5]]]": 1,
       "ForsetiClient[transactionId=50, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=50, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=50, clientId=17]]]": 1,
       "ForsetiClient[transactionId=31, clientId=8] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(48510) because holders of that lock are waiting for ForsetiClient[transactionId=31, clientId=8].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=31, clientId=8]]]": 1,
       "ForsetiClient[transactionId=28, clientId=5] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=31, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(47215) because holders of that lock are waiting for ForsetiClient[transactionId=28, clientId=5].\r\n Wait list:ExclusiveLock[\r\nClient[31] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=28, clientId=5]]]": 1,
       "ForsetiClient[transactionId=51, clientId=6] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(50318) because holders of that lock are waiting for ForsetiClient[transactionId=51, clientId=6].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=51, clientId=6]]]": 1,
       "ForsetiClient[transactionId=59, clientId=4] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(47502) because holders of that lock are waiting for ForsetiClient[transactionId=59, clientId=4].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=59, clientId=4],ForsetiClient[transactionId=-1, clientId=11]]]": 1,
       "ForsetiClient[transactionId=70, clientId=7] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=70, clientId=7].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=70, clientId=7]]]": 1,
       "ForsetiClient[transactionId=53, clientId=8] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=53, clientId=8].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=55, clientId=7],ForsetiClient[transactionId=53, clientId=8]]]": 1,
       "ForsetiClient[transactionId=36, clientId=13] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(46809) because holders of that lock are waiting for ForsetiClient[transactionId=36, clientId=13].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=36, clientId=13]]]": 1,
       "ForsetiClient[transactionId=52, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(50973) because holders of that lock are waiting for ForsetiClient[transactionId=52, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=52, clientId=16],ForsetiClient[transactionId=63, clientId=17],ForsetiClient[transactionId=-1, clientId=15]]]": 1,
       "ForsetiClient[transactionId=58, clientId=13] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(62794) because holders of that lock are waiting for ForsetiClient[transactionId=58, clientId=13].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=35, clientId=12],ForsetiClient[transactionId=58, clientId=13]]]": 1,
       "ForsetiClient[transactionId=37, clientId=14] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=36, clientId=13]} on NODE_RELATIONSHIP_GROUP_DELETE(47277) because holders of that lock are waiting for ForsetiClient[transactionId=37, clientId=14].\r\n Wait list:ExclusiveLock[\r\nClient[36] waits for [ForsetiClient[transactionId=37, clientId=14]]]": 1,
       "ForsetiClient[transactionId=64, clientId=15] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=64, clientId=15].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=64, clientId=15]]]": 1,
       "ForsetiClient[transactionId=27, clientId=4] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(50272) because holders of that lock are waiting for ForsetiClient[transactionId=27, clientId=4].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=27, clientId=4]]]": 1,
       "ForsetiClient[transactionId=65, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45441) because holders of that lock are waiting for ForsetiClient[transactionId=65, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=65, clientId=16],ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=35, clientId=12],ForsetiClient[transactionId=-1, clientId=13]]]": 1,
       "ForsetiClient[transactionId=54, clientId=3] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=54, clientId=3].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=54, clientId=3],ForsetiClient[transactionId=61, clientId=5]]]": 1,
       "ForsetiClient[transactionId=57, clientId=14] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=57, clientId=14].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=-1, clientId=16],ForsetiClient[transactionId=57, clientId=14]]]": 1,
       "ForsetiClient[transactionId=60, clientId=1] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(46245) because holders of that lock are waiting for ForsetiClient[transactionId=60, clientId=1].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=60, clientId=1]]]": 1,
       "ForsetiClient[transactionId=73, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(46030) because holders of that lock are waiting for ForsetiClient[transactionId=73, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=73, clientId=16]]]": 1,
       "ForsetiClient[transactionId=25, clientId=1] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=25, clientId=1].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=25, clientId=1]]]": 1,
       "ForsetiClient[transactionId=62, clientId=10] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45441) because holders of that lock are waiting for ForsetiClient[transactionId=62, clientId=10].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=62, clientId=10]]]": 1,
       "ForsetiClient[transactionId=55, clientId=7] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=32, clientId=9]} on NODE_RELATIONSHIP_GROUP_DELETE(47193) because holders of that lock are waiting for ForsetiClient[transactionId=55, clientId=7].\r\n Wait list:ExclusiveLock[\r\nClient[32] waits for [ForsetiClient[transactionId=55, clientId=7],ForsetiClient[transactionId=-1, clientId=8],ForsetiClient[transactionId=56, clientId=11]]]": 1,
       "ForsetiClient[transactionId=48, clientId=5] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(63368) because holders of that lock are waiting for ForsetiClient[transactionId=48, clientId=5].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=48, clientId=5]]]": 1,
       "ForsetiClient[transactionId=45, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=29, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45602) because holders of that lock are waiting for ForsetiClient[transactionId=45, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[29] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=-1, clientId=18],ForsetiClient[transactionId=34, clientId=11]]]": 1,
       "ForsetiClient[transactionId=32, clientId=9] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(47502) because holders of that lock are waiting for ForsetiClient[transactionId=32, clientId=9].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=-1, clientId=4],ForsetiClient[transactionId=32, clientId=9],ForsetiClient[transactionId=-1, clientId=11]]]": 1,
       "ForsetiClient[transactionId=61, clientId=5] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45453) because holders of that lock are waiting for ForsetiClient[transactionId=61, clientId=5].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=61, clientId=5]]]": 1,
       "ForsetiClient[transactionId=56, clientId=11] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=56, clientId=11].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=56, clientId=11]]]": 1,
       "ForsetiClient[transactionId=49, clientId=18] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=49, clientId=18].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=49, clientId=18]]]": 1,
       "ForsetiClient[transactionId=26, clientId=3] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=26, clientId=3].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=26, clientId=3]]]": 1,
       "ForsetiClient[transactionId=47, clientId=15] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45441) because holders of that lock are waiting for ForsetiClient[transactionId=47, clientId=15].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=47, clientId=15]]]": 1},
      'batch': {'total': 47,
       'errors': {"org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=58, clientId=13] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(62794) because holders of that lock are waiting for ForsetiClient[transactionId=58, clientId=13].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=35, clientId=12],ForsetiClient[transactionId=58, clientId=13]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=48, clientId=5] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(63368) because holders of that lock are waiting for ForsetiClient[transactionId=48, clientId=5].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=48, clientId=5]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=68, clientId=6] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=69, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(46494) because holders of that lock are waiting for ForsetiClient[transactionId=68, clientId=6].\r\n Wait list:ExclusiveLock[\r\nClient[69] waits for [ForsetiClient[transactionId=68, clientId=6]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=46, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(48158) because holders of that lock are waiting for ForsetiClient[transactionId=46, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=46, clientId=16],ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=49, clientId=18],ForsetiClient[transactionId=-1, clientId=6]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=53, clientId=8] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=53, clientId=8].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=55, clientId=7],ForsetiClient[transactionId=53, clientId=8]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=56, clientId=11] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=56, clientId=11].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=56, clientId=11]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=37, clientId=14] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=36, clientId=13]} on NODE_RELATIONSHIP_GROUP_DELETE(47277) because holders of that lock are waiting for ForsetiClient[transactionId=37, clientId=14].\r\n Wait list:ExclusiveLock[\r\nClient[36] waits for [ForsetiClient[transactionId=37, clientId=14]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=32, clientId=9] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(47502) because holders of that lock are waiting for ForsetiClient[transactionId=32, clientId=9].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=-1, clientId=4],ForsetiClient[transactionId=32, clientId=9],ForsetiClient[transactionId=-1, clientId=11]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=45, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=29, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45602) because holders of that lock are waiting for ForsetiClient[transactionId=45, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[29] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=-1, clientId=18],ForsetiClient[transactionId=34, clientId=11]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=54, clientId=3] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=54, clientId=3].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=54, clientId=3],ForsetiClient[transactionId=61, clientId=5]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=74, clientId=15] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=69, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=74, clientId=15].\r\n Wait list:ExclusiveLock[\r\nClient[69] waits for [ForsetiClient[transactionId=74, clientId=15]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=30, clientId=7] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(53312) because holders of that lock are waiting for ForsetiClient[transactionId=30, clientId=7].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=30, clientId=7]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=70, clientId=7] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=70, clientId=7].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=70, clientId=7]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=62, clientId=10] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45441) because holders of that lock are waiting for ForsetiClient[transactionId=62, clientId=10].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=62, clientId=10]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=66, clientId=18] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(48126) because holders of that lock are waiting for ForsetiClient[transactionId=66, clientId=18].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=66, clientId=18]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=50, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=50, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=50, clientId=17]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=26, clientId=3] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=26, clientId=3].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=26, clientId=3]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=29, clientId=6] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(46076) because holders of that lock are waiting for ForsetiClient[transactionId=29, clientId=6].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=-1, clientId=18],ForsetiClient[transactionId=29, clientId=6]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=57, clientId=14] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=57, clientId=14].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=-1, clientId=16],ForsetiClient[transactionId=57, clientId=14]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=61, clientId=5] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45453) because holders of that lock are waiting for ForsetiClient[transactionId=61, clientId=5].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=61, clientId=5]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=64, clientId=15] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=64, clientId=15].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=64, clientId=15]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=25, clientId=1] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=25, clientId=1].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=25, clientId=1]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=71, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=69, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=71, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[69] waits for [ForsetiClient[transactionId=71, clientId=17]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=55, clientId=7] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=32, clientId=9]} on NODE_RELATIONSHIP_GROUP_DELETE(47193) because holders of that lock are waiting for ForsetiClient[transactionId=55, clientId=7].\r\n Wait list:ExclusiveLock[\r\nClient[32] waits for [ForsetiClient[transactionId=55, clientId=7],ForsetiClient[transactionId=-1, clientId=8],ForsetiClient[transactionId=56, clientId=11]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=65, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45441) because holders of that lock are waiting for ForsetiClient[transactionId=65, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=65, clientId=16],ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=35, clientId=12],ForsetiClient[transactionId=-1, clientId=13]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=47, clientId=15] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45441) because holders of that lock are waiting for ForsetiClient[transactionId=47, clientId=15].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=47, clientId=15]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=44, clientId=18] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(46076) because holders of that lock are waiting for ForsetiClient[transactionId=44, clientId=18].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=44, clientId=18],ForsetiClient[transactionId=-1, clientId=5]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=36, clientId=13] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(46809) because holders of that lock are waiting for ForsetiClient[transactionId=36, clientId=13].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=36, clientId=13]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=51, clientId=6] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(50318) because holders of that lock are waiting for ForsetiClient[transactionId=51, clientId=6].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=51, clientId=6]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=31, clientId=8] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(48510) because holders of that lock are waiting for ForsetiClient[transactionId=31, clientId=8].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=31, clientId=8]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=28, clientId=5] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=31, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(47215) because holders of that lock are waiting for ForsetiClient[transactionId=28, clientId=5].\r\n Wait list:ExclusiveLock[\r\nClient[31] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=28, clientId=5]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=60, clientId=1] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(46245) because holders of that lock are waiting for ForsetiClient[transactionId=60, clientId=1].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=60, clientId=1]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=73, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(46030) because holders of that lock are waiting for ForsetiClient[transactionId=73, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=73, clientId=16]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=49, clientId=18] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=49, clientId=18].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=49, clientId=18]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=63, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=63, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=63, clientId=17],ForsetiClient[transactionId=56, clientId=11]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=52, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(50973) because holders of that lock are waiting for ForsetiClient[transactionId=52, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=52, clientId=16],ForsetiClient[transactionId=63, clientId=17],ForsetiClient[transactionId=-1, clientId=15]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=27, clientId=4] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(50272) because holders of that lock are waiting for ForsetiClient[transactionId=27, clientId=4].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=27, clientId=4]]]": 1,
        "org.neo4j.kernel.DeadlockDetectedException: ForsetiClient[transactionId=59, clientId=4] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(47502) because holders of that lock are waiting for ForsetiClient[transactionId=59, clientId=4].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=59, clientId=4],ForsetiClient[transactionId=-1, clientId=11]]]": 1},
       'committed': 9,
       'failed': 38},
      'operations': {'total': 46419,
       'errors': {"ForsetiClient[transactionId=63, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=63, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=63, clientId=17],ForsetiClient[transactionId=56, clientId=11]]]": 1,
        "ForsetiClient[transactionId=71, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=69, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=71, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[69] waits for [ForsetiClient[transactionId=71, clientId=17]]]": 1,
        "ForsetiClient[transactionId=74, clientId=15] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=69, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=74, clientId=15].\r\n Wait list:ExclusiveLock[\r\nClient[69] waits for [ForsetiClient[transactionId=74, clientId=15]]]": 1,
        "ForsetiClient[transactionId=66, clientId=18] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(48126) because holders of that lock are waiting for ForsetiClient[transactionId=66, clientId=18].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=66, clientId=18]]]": 1,
        "ForsetiClient[transactionId=68, clientId=6] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=69, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(46494) because holders of that lock are waiting for ForsetiClient[transactionId=68, clientId=6].\r\n Wait list:ExclusiveLock[\r\nClient[69] waits for [ForsetiClient[transactionId=68, clientId=6]]]": 1,
        "ForsetiClient[transactionId=46, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(48158) because holders of that lock are waiting for ForsetiClient[transactionId=46, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=46, clientId=16],ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=49, clientId=18],ForsetiClient[transactionId=-1, clientId=6]]]": 1,
        "ForsetiClient[transactionId=29, clientId=6] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(46076) because holders of that lock are waiting for ForsetiClient[transactionId=29, clientId=6].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=-1, clientId=18],ForsetiClient[transactionId=29, clientId=6]]]": 1,
        "ForsetiClient[transactionId=30, clientId=7] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(53312) because holders of that lock are waiting for ForsetiClient[transactionId=30, clientId=7].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=30, clientId=7]]]": 1,
        "ForsetiClient[transactionId=44, clientId=18] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(46076) because holders of that lock are waiting for ForsetiClient[transactionId=44, clientId=18].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=44, clientId=18],ForsetiClient[transactionId=-1, clientId=5]]]": 1,
        "ForsetiClient[transactionId=50, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=50, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=50, clientId=17]]]": 1,
        "ForsetiClient[transactionId=31, clientId=8] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(48510) because holders of that lock are waiting for ForsetiClient[transactionId=31, clientId=8].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=31, clientId=8]]]": 1,
        "ForsetiClient[transactionId=28, clientId=5] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=31, clientId=8]} on NODE_RELATIONSHIP_GROUP_DELETE(47215) because holders of that lock are waiting for ForsetiClient[transactionId=28, clientId=5].\r\n Wait list:ExclusiveLock[\r\nClient[31] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=28, clientId=5]]]": 1,
        "ForsetiClient[transactionId=51, clientId=6] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(50318) because holders of that lock are waiting for ForsetiClient[transactionId=51, clientId=6].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=51, clientId=6]]]": 1,
        "ForsetiClient[transactionId=59, clientId=4] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(47502) because holders of that lock are waiting for ForsetiClient[transactionId=59, clientId=4].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=59, clientId=4],ForsetiClient[transactionId=-1, clientId=11]]]": 1,
        "ForsetiClient[transactionId=70, clientId=7] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=70, clientId=7].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=70, clientId=7]]]": 1,
        "ForsetiClient[transactionId=53, clientId=8] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=53, clientId=8].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=55, clientId=7],ForsetiClient[transactionId=53, clientId=8]]]": 1,
        "ForsetiClient[transactionId=36, clientId=13] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(46809) because holders of that lock are waiting for ForsetiClient[transactionId=36, clientId=13].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=36, clientId=13]]]": 1,
        "ForsetiClient[transactionId=52, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(50973) because holders of that lock are waiting for ForsetiClient[transactionId=52, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=52, clientId=16],ForsetiClient[transactionId=63, clientId=17],ForsetiClient[transactionId=-1, clientId=15]]]": 1,
        "ForsetiClient[transactionId=58, clientId=13] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(62794) because holders of that lock are waiting for ForsetiClient[transactionId=58, clientId=13].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=35, clientId=12],ForsetiClient[transactionId=58, clientId=13]]]": 1,
        "ForsetiClient[transactionId=37, clientId=14] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=36, clientId=13]} on NODE_RELATIONSHIP_GROUP_DELETE(47277) because holders of that lock are waiting for ForsetiClient[transactionId=37, clientId=14].\r\n Wait list:ExclusiveLock[\r\nClient[36] waits for [ForsetiClient[transactionId=37, clientId=14]]]": 1,
        "ForsetiClient[transactionId=64, clientId=15] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=64, clientId=15].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=64, clientId=15]]]": 1,
        "ForsetiClient[transactionId=27, clientId=4] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(50272) because holders of that lock are waiting for ForsetiClient[transactionId=27, clientId=4].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=27, clientId=4]]]": 1,
        "ForsetiClient[transactionId=65, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=56, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45441) because holders of that lock are waiting for ForsetiClient[transactionId=65, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[56] waits for [ForsetiClient[transactionId=65, clientId=16],ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=35, clientId=12],ForsetiClient[transactionId=-1, clientId=13]]]": 1,
        "ForsetiClient[transactionId=54, clientId=3] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=54, clientId=3].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=54, clientId=3],ForsetiClient[transactionId=61, clientId=5]]]": 1,
        "ForsetiClient[transactionId=57, clientId=14] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=57, clientId=14].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=-1, clientId=16],ForsetiClient[transactionId=57, clientId=14]]]": 1,
        "ForsetiClient[transactionId=60, clientId=1] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(46245) because holders of that lock are waiting for ForsetiClient[transactionId=60, clientId=1].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=60, clientId=1]]]": 1,
        "ForsetiClient[transactionId=73, clientId=16] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(46030) because holders of that lock are waiting for ForsetiClient[transactionId=73, clientId=16].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=73, clientId=16]]]": 1,
        "ForsetiClient[transactionId=25, clientId=1] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=25, clientId=1].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=25, clientId=1]]]": 1,
        "ForsetiClient[transactionId=62, clientId=10] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45441) because holders of that lock are waiting for ForsetiClient[transactionId=62, clientId=10].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=62, clientId=10]]]": 1,
        "ForsetiClient[transactionId=55, clientId=7] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=32, clientId=9]} on NODE_RELATIONSHIP_GROUP_DELETE(47193) because holders of that lock are waiting for ForsetiClient[transactionId=55, clientId=7].\r\n Wait list:ExclusiveLock[\r\nClient[32] waits for [ForsetiClient[transactionId=55, clientId=7],ForsetiClient[transactionId=-1, clientId=8],ForsetiClient[transactionId=56, clientId=11]]]": 1,
        "ForsetiClient[transactionId=48, clientId=5] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=33, clientId=10]} on NODE_RELATIONSHIP_GROUP_DELETE(63368) because holders of that lock are waiting for ForsetiClient[transactionId=48, clientId=5].\r\n Wait list:ExclusiveLock[\r\nClient[33] waits for [ForsetiClient[transactionId=48, clientId=5]]]": 1,
        "ForsetiClient[transactionId=45, clientId=17] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=29, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45602) because holders of that lock are waiting for ForsetiClient[transactionId=45, clientId=17].\r\n Wait list:ExclusiveLock[\r\nClient[29] waits for [ForsetiClient[transactionId=45, clientId=17],ForsetiClient[transactionId=-1, clientId=18],ForsetiClient[transactionId=34, clientId=11]]]": 1,
        "ForsetiClient[transactionId=32, clientId=9] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(47502) because holders of that lock are waiting for ForsetiClient[transactionId=32, clientId=9].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=-1, clientId=4],ForsetiClient[transactionId=32, clientId=9],ForsetiClient[transactionId=-1, clientId=11]]]": 1,
        "ForsetiClient[transactionId=61, clientId=5] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45453) because holders of that lock are waiting for ForsetiClient[transactionId=61, clientId=5].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=61, clientId=5]]]": 1,
        "ForsetiClient[transactionId=56, clientId=11] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=35, clientId=12]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=56, clientId=11].\r\n Wait list:ExclusiveLock[\r\nClient[35] waits for [ForsetiClient[transactionId=56, clientId=11]]]": 1,
        "ForsetiClient[transactionId=49, clientId=18] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45541) because holders of that lock are waiting for ForsetiClient[transactionId=49, clientId=18].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=49, clientId=18]]]": 1,
        "ForsetiClient[transactionId=26, clientId=3] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=34, clientId=11]} on NODE_RELATIONSHIP_GROUP_DELETE(45599) because holders of that lock are waiting for ForsetiClient[transactionId=26, clientId=3].\r\n Wait list:ExclusiveLock[\r\nClient[34] waits for [ForsetiClient[transactionId=26, clientId=3]]]": 1,
        "ForsetiClient[transactionId=47, clientId=15] can't acquire ExclusiveLock{owner=ForsetiClient[transactionId=51, clientId=6]} on NODE_RELATIONSHIP_GROUP_DELETE(45441) because holders of that lock are waiting for ForsetiClient[transactionId=47, clientId=15].\r\n Wait list:ExclusiveLock[\r\nClient[51] waits for [ForsetiClient[transactionId=-1, clientId=17],ForsetiClient[transactionId=47, clientId=15]]]": 1},
       'committed': 9000,
       'failed': 37419},
      'wasTerminated': False,
      'failedParams': {},
      'updateStatistics': {'relationshipsDeleted': 0,
       'relationshipsCreated': 54369,
       'nodesDeleted': 0,
       'nodesCreated': 15129,
       'labelsRemoved': 0,
       'labelsAdded': 15129,
       'propertiesSet': 15129}}]
# Update schema
graph.refresh_schema()
# Print the current schema
print(graph.schema)
Node properties:
    Movie {id: STRING, title: STRING, popularity: FLOAT}
    Keyword {name: STRING}
    Relationship properties:
    
    The relationships:
    (:Movie)-[:HAS_KEYWORD]->(:Keyword)
enhanced_graph = Neo4jGraph(enhanced_schema=True)
print(enhanced_graph.schema)
Received notification from DBMS server: {severity: WARNING} {code: Neo.ClientNotification.Statement.FeatureDeprecationWarning} {category: DEPRECATION} {title: This feature is deprecated and will be removed in future versions.} {description: The procedure has a deprecated field. ('config' used by 'apoc.meta.graphSample' is deprecated.)} {position: line: 1, column: 1, offset: 0} for query: "CALL apoc.meta.graphSample() YIELD nodes, relationships RETURN nodes, [rel in relationships | {name:apoc.any.property(rel, 'type'), count: apoc.any.property(rel, 'count')}] AS relationships"
Node properties:
- **Movie**
  - `id`: STRING Example: "862"
  - `title`: STRING Example: "Toy Story"
  - `popularity`: FLOAT Example: "21.946943"
- **Keyword**
  - `name`: STRING Example: "terror"
Relationship properties:

The relationships:
(:Movie)-[:HAS_KEYWORD]->(:Keyword)
from langchain_neo4j import GraphCypherQAChain
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o", temperature=0)
chain = GraphCypherQAChain.from_llm(
    graph=enhanced_graph, llm=llm, verbose=True, allow_dangerous_requests=True
)

response = chain.invoke(
    {
        "query": "What movies have a popularity score above 8.0 and are tagged with 'comedy'?"
    }
)
response
    
    > Entering new GraphCypherQAChain chain...
    Generated Cypher:
    cypher
    MATCH (m:Movie)-[:HAS_KEYWORD]->(k:Keyword {name: 'comedy'})
    WHERE m.popularity > 8.0
    RETURN m.title
    
    Full Context:
    [{'m.title': 'Ratchet & Clank'}, {'m.title': 'Kick-Ass'}, {'m.title': 'Jackass 3D'}, {'m.title': 'Ratchet & Clank'}, {'m.title': 'Ratchet & Clank'}, {'m.title': 'Aliens in the Attic'}, {'m.title': 'Ratchet & Clank'}, {'m.title': "A Dog's Will"}, {'m.title': 'Ratchet & Clank'}, {'m.title': 'Ratchet & Clank'}]
    
    > Finished chain.
{'query': "What movies have a popularity score above 8.0 and are tagged with 'comedy'?",
 'result': "Ratchet & Clank, Kick-Ass, Jackass 3D, Aliens in the Attic, A Dog's Will have a popularity score above 8.0 and are tagged with 'comedy'."}

Let's try running a few more simple example queries.

response = chain.invoke(
    {"query": "What is the average popularity score of movies tagged with 'romance'?"}
)

response
    
    > Entering new GraphCypherQAChain chain...
    Generated Cypher:
    cypher
    MATCH (m:Movie)-[:HAS_KEYWORD]->(k:Keyword {name: 'romance'})
    RETURN avg(m.popularity) AS average_popularity
    
    Full Context:
    [{'average_popularity': 12.390850747422673}]
    
    > Finished chain.
{'query': "What is the average popularity score of movies tagged with 'romance'?",
 'result': "The average popularity score of movies tagged with 'romance' is 12.390850747422673."}
response = chain.invoke(
    {"query": "What movies are tagged with both 'comedy' and 'romance'?"}
)

response
    
    > Entering new GraphCypherQAChain chain...
    Generated Cypher:
    cypher
    MATCH (m:Movie)-[:HAS_KEYWORD]->(k1:Keyword {name: 'comedy'}),
          (m)-[:HAS_KEYWORD]->(k2:Keyword {name: 'romance'})
    RETURN m.title
    
    Full Context:
    [{'m.title': 'Lisbela and the Prisoner'}, {'m.title': 'Lisbela and the Prisoner'}, {'m.title': 'Lisbela and the Prisoner'}, {'m.title': 'Lisbela and the Prisoner'}, {'m.title': 'Lisbela and the Prisoner'}, {'m.title': 'Lisbela and the Prisoner'}, {'m.title': 'Love Hina Christmas Special: Silent Eve'}, {'m.title': 'Love Is in the Air'}, {'m.title': 'Love Is in the Air'}, {'m.title': 'Love Is in the Air'}]
    
    > Finished chain.
{'query': "What movies are tagged with both 'comedy' and 'romance'?",
 'result': "Lisbela and the Prisoner, Love Hina Christmas Special: Silent Eve, Love Is in the Air are tagged with both 'comedy' and 'romance'."}

Building Q&A systems with graph databases involves executing model-generated queries, which carries inherent risks. To minimize these risks, restrict database permissions to the narrowest scope required for your chain or agent. While this reduces vulnerabilities, it does not eliminate them entirely. For more security best practices, see the .

Set up the environment. You may refer to for more details.

You can checkout the for more details.

[Note] You can also set up a free, cloud-based Neo4j instance using , an online platform for working with graph databases.

Now that we’re incorporating more diverse user and movie information, we can expand our perspective on movie recommendations. We'll utilize to run simple queries for recommendations.

LangChain security documentation
Neo4j
LangChain: Build a Question Answering application over a Graph Database
Kaggle: The Movies Dataset
Environment Setup
langchain-opentutorial
installation
Neo4j Sandbox
Kaggle's The Movies Dataset
Overview
Environement Setup
Connect to Neo4j Graph Database
Graph Schema
GraphQACypherChain
Using a New Dataset
Connect to Neo4j Graph Database
Heesun Moon
Jongcheol Kim
Taylor(Jihyun Kim)
Juni Lee
LangChain Open Tutorial
basic-workflow
setup-01
setup-02
setup-03
chain-flow
setup-05
setup-06
setup-07