GraphRAG 向け Neo4j グラフデータベースのインストール、Cypher、ベクトル、運用

グラフ、Cypher、ベクトル、およびオペレーションの強化。

目次

Neo4j は、関係そのものがデータであるときに選択するソリューションです。ドメインが白板に描かれた円と矢印の図のように見える場合、それをテーブルに無理やり押し込むのは苦痛を伴います。

Neo4j は、この図をプロパティグラフとしてモデル化し、Cypher でクエリを実行します。

Graph and data infrastructure

本ガイドでは、Neo4j の用途ACID 特性Neo4j vs Amazon Neptune vs TigerGraph(および同種他社)の比較、ベクトルインデックスを用いたGraphRAGローカルと本番環境のインストール方法ポートと neo4j.conf の設定、そしてコピー&ペースト可能なCypher と Python のパターンについて解説します。

データインフラストラクチャの選択に関する広範な文脈については、AI システム向けのデータインフラストラクチャ の支柱を参照してください。

本番環境でのグラフワークロードにおける Neo4j の用途

Neo4j は、制約のある本番環境下で、反復して「つながった問い」を投げかける必要がある連結データ向けに設計されています。これが、多くのチームにおける「Neo4j は何に使われるのか」という問いへの直接的な答えです。

ノード、関係、プロパティによるプロパティグラフデータモデル

Neo4j はプロパティグラフモデルを使用します。ノードはエンティティを表し、関係はノード同士を結び、両者はプロパティを持つことができます。ラベルと関係タイプは、脆いスキーマに縛られることなく構造を提供します。

薄いモデルから始めて価値を提供し、新しい問いが現れるにつれてグラフを進化させることができます。

結合の泥沼を避けるパターンマッチングのための Cypher グラフクエリ言語

Cypher は宣言的であり、パターンマッチングを基盤としています。サブグラフの形状を記述し、プランナーに実行を任せるだけです。

SQL が「集合」について語るなら、Cypher は「サブグラフ」について語ります。これは、マルチホップトラバーサル、パスクエリ、レコメンデーション、出所追跡、そして「どのシステムを介して誰が何を触ったか」といった問いにおいて重要です。

Neo4j は ACID 準拠か、そしてなぜ気にすべきか

Neo4j は ACID 準拠ですか? はい。関係の作成や更新は一貫した構造に触れるものであり、データベースは障害や並行性下でもそれを一貫して保ちます。

強固なトランザクション保証を前提としてグラフアプリを設計してください(そうせざるを得ない場合を除き)。これは、曖昧な最終整合性を仮定する場合よりも、デバッグや挙動の推論を格段に容易にします。

Neo4j vs Amazon Neptune vs TigerGraph: シニアエンジニアによる比較

「Neo4j vs X」という問いは、通常「数年間どのエコシステムで生きていくか」という問いです。

ベンチマークのスライドではなく、エンジニアリング時間に関する短く意見のある視点です。

製品 コアモデルとクエリスタイル 得意分野 課題点
Neo4j プロパティグラフと Cypher 連結データに対する優れた操作性、成熟したツール、グラフとベクトル検索の統合 グラフモデリングは投資が必要となるスキル
Amazon Neptune AWS 上のマネージドグラフ (Gremlin, openCypher, RDF 用 SPARQL) AWS 中心の契約と運用 クエリ言語の混在がプラットフォーム主導に感じる
TigerGraph GSQL と OpenCypher 関連パターン 分析スタイルのワークロードとコンパイル済みクエリアプローチ 思考モデルが異なる;どこでも Cypher をそのまま使えるわけではない
JanusGraph 外部ストレージバックエンドを持つ分散グラフ プラグイン可能なバックエンドを持つオープンソース バックエンドスタックを自分で運用する必要がある
ArangoDB マルチモデル (ドキュメント、KV、グラフ) 多様な形状に対する単一のデータベース グラフファーストエンジンとの比較でグラフの深さが異なる
Memgraph プロパティグラフ、Cypher 互換 ストリーミングとフレッシュデータのワークフロー エンジンの挙動が異なる;互換性は同一性ではない

グラフデータベースを選ぶ前に決めるべきこと

最初にクエリ言語運用モデルを選びます。

チームが Cypher とグラフファーストのワークフローを望む場合、Neo4j は強力なデフォルト選択肢です。既に Gremlin の専門知識がある場合、Neptune や JanusGraph が適しています。単一のマルチモデルストアを望む場合、ArangoDB が部品点数を減らすことができます。

運用について正直になることが重要です。「分散ストレージバックエンドを運用する」というのは、午前 3 時にコンパクションや JVM プレッシャーで呼び出されるまでは簡単に言えます。

RAG と GraphRAG における Neo4j: ベクトル検索とグラフコンテキスト

多くの RAG スタックはベクトル検索とプロンプトから始まります。これは、出所追跡、エンティティ解決、マルチホップコンテキスト、または曖昧さ解消が必要になるまで機能しますが、その後はアプリケーションコード内で知識グラフを再構築するリスクに直面します。

GraphRAG はどのように RAG を改善するのか? グラフを使用して構造化されたコンテキスト(エンティティ、関係、近傍)を抽出し、類似性だけでは見落としがちな情報を提供することで、グラウンディング(根拠付け)信頼性を支援します。

埋め込み類似性検索のための Neo4j ベクトルインデックス

Neo4j で RAG 用のベクトル検索は可能か? はい。Neo4j は、埋め込み値に対する類似性のためのベクトルインデックス(一般的には HNSW スタイルの近似最近傍検索)をサポートしています。

ベクトルは「似たもの」を見つけますが、それ自体ではドメイン内での「関係のあり方」をエンコードしません。Neo4j は、類似性とトラバーサルを組み合わせることを可能にします。

ベクトル制約付きパターンマッチングのための SEARCH 節の使用

Neo4j のSEARCH 節を使用すると、ベクトルインデックスからの近似最近傍ヒットを使用して Cypher MATCH パターンの制約をかけることができます。これはハイブリッド検索のための操作性の高い架け橋です。

実用的なパターン:ベクトル検索で候補を取得し、その後、コンテキスト、フィルタ、説明のためにグラフを拡張します。

neo4j-graphrag を使用した Python での GraphRAG

Neo4j の Python 向けneo4j-graphragパッケージは、ドライバー、リトリバー、LLM インターフェースを GraphRAG フローに接続します。責任を分割するために外部ベクトルストアを使用することも可能です。

ローカルと本番環境への Neo4j インストール方法

どのようにしてローカルに Neo4j をインストールするか? リスクプロファイルに合わせてオプションを選択します。

ローカル開発用 Docker での Neo4j インストール

Docker は、再現可能なサーバーへの最速のパスです。

# 最小限の実行。再起動間でのデータ永続化は行われません。
docker run \
  --restart always \
  --publish=7474:7474 --publish=7687:7687 \
  neo4j:5

実作業では、初期パスワードを設定し、データボリュームをマウントしてください。

docker run \
  --restart always \
  --publish=7474:7474 --publish=7687:7687 \
  --env NEO4J_AUTH=neo4j/your_password \
  --volume=$HOME/neo4j/data:/data \
  neo4j:5

チームに優しい設定のための Docker Compose

services:
  neo4j:
    image: neo4j:5
    ports:
      - "7474:7474"
      - "7687:7687"
    environment:
      - NEO4J_AUTH=neo4j/your_password
    volumes:
      - $HOME/neo4j/logs:/logs
      - $HOME/neo4j/config:/config
      - $HOME/neo4j/data:/data
      - $HOME/neo4j/plugins:/plugins
    restart: always

Neo4j Desktop

Neo4j Desktop は、プロトタイピングや教育に優れています(プロジェクト、GUI、ローカルインスタンス)。CI や統合テストには、通常 Docker が選ばれます。

Linux、Windows、または macOS サーバー

長期間稼働するホストの場合は、公式の OS インストール手順に従ってください。最終的には、サービス管理、ログ、メモリ、バックアップ、アップグレードに関心を持つようになります。

Neo4j AuraDB (マネージド)

データベースを運用するよりも製品をリリースすることに集中したい場合は、AuraDB がマネージドな Neo4j クラウドオプションです。

Helm を使用した Kubernetes

プラットフォームが Kubernetes の場合、Helm ベースのデプロイメントを使用し、サービスを通じて Bolt と HTTP を公開します。組織がそこで状態を信頼できる方法で実行できる場合にのみ、K8s 上にデータベースをデプロイしてください。

Neo4j 設定の必須事項:ポート、コネクタ、および neo4j.conf

設定は neo4j.conf(key=value、# コメント)に住んでいます。厳格な検証により、トラフィックを処理する前にタイプミスを検出できます。

デフォルトの Neo4j ポートとコネクタ

デフォルトの Neo4j ポートは何ですか? Bolt は 7687、HTTP は 7474、HTTPS は 7473 がデフォルトです。本番環境では必要なもののみを公開してください。多くの場合、プライベートネットワーク上の Bolt と制限された HTTP UI です。

強化の例(IP と TLS を環境に合わせて調整してください):

server.bolt.listen_address=10.0.1.10:7687
server.http.listen_address=127.0.0.1:7474
server.https.enabled=true
server.https.listen_address=10.0.1.10:7473

無制限の損傷を制限するトランザクション設定

レビューで有用なレバーには、暴走クエリに対するdb.transaction.timeout と、サンダーバード現象(多数の同時リクエスト)を避けるためのdb.transaction.concurrent.maximum があります。

db.transaction.timeout=10s
db.transaction.concurrent.maximum=1000

RAG 向けの Cypher とベクトルインデックスの実用的な例

ベクトルインデックスの作成と埋め込みの保存

CREATE VECTOR INDEX doc_embeddings
FOR (d:Document) ON (d.embedding)
OPTIONS {indexConfig: {
  `vector.dimensions`: 1536,
  `vector.similarity_function`: "cosine"
}};

ベクトル検索後のグラフ拡張

  1. 候補ノードのベクトル検索。
  2. 近傍、出所、制約のトラバーサル。
  3. 明確な境界線を持つ LLM 用コンテキストのフォーマット。

MATCH 内での SEARCH を使用した例(構文は Neo4j バージョンによってわずかに異なる場合があります—サーバーバージョンのマニュアルを確認してください):

MATCH (d:Document)
  SEARCH d IN (
    VECTOR INDEX doc_embeddings
    FOR $queryEmbedding
    LIMIT 10
  ) SCORE AS score
MATCH (d)-[:MENTIONS]->(e:Entity)
RETURN d.id AS doc_id, score, collect(distinct e.name) AS entities
ORDER BY score DESC
LIMIT 5;

Python での最小限の GraphRAG

from neo4j import GraphDatabase
from neo4j_graphrag.retrievers import VectorRetriever
from neo4j_graphrag.embeddings import OpenAIEmbeddings
from neo4j_graphrag.llm import OpenAILLM
from neo4j_graphrag.generation import GraphRAG

driver = GraphDatabase.driver("neo4j://localhost:7687", auth=("neo4j", "password"))

embedder = OpenAIEmbeddings(model="text-embedding-3-large")
retriever = VectorRetriever(driver, "doc_embeddings", embedder)

llm = OpenAILLM(model_name="gpt-4o", model_params={"temperature": 0})

rag = GraphRAG(retriever=retriever, llm=llm)

response = rag.search(query_text="How do I do similarity search in Neo4j?", retriever_config={"top_k": 5})
print(response.answer)

実世界の Neo4j 使用例:不正検出、レコメンデーション、知識グラフ

不正検出とリスクグラフ

不正行為は稀に 1 行のものではありません。それは、アカウント、デバイス、IP、マーチャント、アイデンティティ、時間を超えたパターンです。グラフは、10 重結合の迷路なしに近傍とマルチホップパスを表現します。

行動と明示的な関係を用いたレコメンデーション

本番環境のレコメンデーションは、スコア付き候補在庫、制約、階層、そして説明可能性を組み合わせています。グラフは、人々が推論できるパスを返すのを支援します。

RAG とエージェント向けの知識グラフ

RAG はグラウンディング(根拠)を必要とし、エージェントはメモリ、出所、制約を必要とします。知識グラフは、エンティティ、関係、ソース、埋め込みを 1 つのモデルに保存します—GraphRAG に最適な組み合わせです。

Amazon Neptune や TigerGraph の代わりに Neo4j を選ぶべき時はいつか?

いつ Amazon Neptune や TigerGraph の代わりに Neo4j を選ぶべきか? Cypher ファーストなグラフと、1 つの製品でのベクトル+トラバーサルを望む場合に Neo4j を選びます。AWSGremlin または RDFが組織に合致する場合に Neptune を選びます。GSQL分析スタイルのワークロードが主な賭けである場合に TigerGraph を選びます。

有用なリンク