
MCPを使ってNeo4jからデータを取得する
こんばんは、製造ビジネステクノロジー部の夏目です。
今回はNeo4jの公式MCPサーバーを試してみようと思います。
Neo4j
グラフ型データベースで一番有名なものです。
いろいろなところで使用されています。
今回はこちらのデモサーバーに接続して、自然言語を用いてデータの取得をしてみようと思います。
mcp-neo4j
Neo4jが出しているMCPサーバーです。
三種類あり、次のようになっています。
mcp-neo4j-cypher
: 自然言語からCypherクエリ
- 設定されたデータベースのデータベーススキーマを取得し、そのデータベースに対して生成された読み取りと書き込みのCypherクエリを実行する。
mcp-neo4j-memory
: Neo4jに保存されたナレッジグラフ・メモリー
- ローカルまたはリモートのNeo4jインスタンスに、個人のナレッジグラフからエンティティやリレーションシップを保存し、取得します。異なるセッション、会話、クライアントから情報にアクセスできます。
mcp-neo4j-cloud-aura-api
: Neo4j Auraクラウド・サービス管理API
- AIアシスタントの快適なチャットからNeo4j Auraインスタンスを直接管理できます。
- インスタンスの作成と破棄、名前によるインスタンスの検索、スケールアップとスケールダウン、機能の有効化ができます。
https://github.com/neo4j-contrib/mcp-neo4j?tab=readme-ov-file#servers
今回は mcp-neo4j-cypher
を使ってみます。
(Cypher
はNeo4jを扱うための独自のQuery言語)
mcp-neo4j-cypher
データベースとのインタラクションを提供し、Neo4jを通じてグラフ探索機能を可能にするモデルコンテキストプロトコル(MCP)サーバーの実装。このサーバーは、Cypherグラフクエリを実行し、複雑なドメインデータを分析し、クロードの分析で強化できるビジネスインサイトを自動的に生成することができます。
https://github.com/neo4j-contrib/mcp-neo4j/tree/main/servers/mcp-neo4j-cypher#-overview
LLMでCypherのQueryを作成し、Neo4jにQueryを投げることができます。
正確に言うと、次の3つのToolが定義されています。
read-neo4j-cypher
- Cypher 読み取りクエリを実行してデータベースからデータを読み取ります
write-neo4j-cypher
- Cypherクエリの更新を実行する
get-neo4j-schema
- グラフデータベース内の全ノードタイプ、その属性(名前、タイプ、他のノードタイプとの関係)のリストを取得する。
https://github.com/neo4j-contrib/mcp-neo4j/tree/main/servers/mcp-neo4j-cypher#%EF%B8%8F-tools
今回は更新以外の取得を試してみます。
MCPサーバーを設定する
{
"mcpServers": {
"neo4j": {
"command": "uvx",
"args": ["mcp-neo4j-cypher@0.2.1"],
"env": {
"NEO4J_URI": "neo4j+s://demo.neo4jlabs.com",
"NEO4J_USERNAME": "movies",
"NEO4J_PASSWORD": "movies",
"NEO4J_DATABASE": "movies"
}
}
}
}
今回はNeo4jのデモサーバーを使用するのでUSERNAME
やPASSWORD
もそのまま書いています。
今回使用するのは映画の情報が入れられたデータベースです。
映画や俳優、監督、脚本、プロデューサーが格納されています。
使ってみる
まずスキーマを取得してみます。
プロンプト
Neo4jのスキーマを取得してください
結果
Neo4jのスキーマを取得しますね。Neo4jデータベースのノードタイプやそれらの関係性について情報を収集します。
get_neo4j_schema
リクエスト{}
レスンポンス[{"label": "Movie", "attributes": {"released": "INTEGER", "title": "STRING unique indexed", "votes": "INTEGER", "tagline": "STRING"}, "relationships": {}}, {"label": "Person", "attributes": {"born": "INTEGER indexed", "name": "STRING unique indexed"}, "relationships": {"ACTED_IN": "Movie", "PRODUCED": "Movie", "DIRECTED": "Movie", "FOLLOWS": "Person", "REVIEWED": "Movie", "WROTE": "Movie"}}]
Neo4jデータベースのスキーマ情報を取得しました。このデータベースには以下の2つのノードラベルと、それらの間の関係性が定義されています:
ノードラベル
Movie(映画)
- 属性:
- released:整数型(公開年)
- title:文字列型(一意、インデックス付き)(タイトル)
- votes:整数型(投票数)
- tagline:文字列型(キャッチフレーズ)
Person(人物)
- 属性:
- born:整数型(インデックス付き)(生年)
- name:文字列型(一意、インデックス付き)(名前)
関係性
Personノードから出ている関係性:
- ACTED_IN:Person → Movie(出演した)
- PRODUCED:Person → Movie(製作した)
- DIRECTED:Person → Movie(監督した)
- FOLLOWS:Person → Person(フォローしている)
- REVIEWED:Person → Movie(レビューした)
- WROTE:Person → Movie(脚本を書いた)
このスキーマは映画データベースを表現しており、人物(俳優、監督、製作者など)と映画の関係性を示しています。何か特定のクエリを実行したい場合は、お知らせください。
スキーマの取得ができました。
次に映画のタイトルとキャッチフレーズを取得します。
プロンプト
映画のタイトルとキャッチフレーズを20件取得してください
結果
映画のタイトルとキャッチフレーズを20件取得します。
read_neo4j_cypher
リクエスト{ `query`: `MATCH (m:Movie) RETURN m.title, m.tagline LIMIT 20` }
レスポンス[{"m.title": "The Matrix", "m.tagline": "Welcome to the Real World"}, {"m.title": "The Matrix Reloaded", "m.tagline": "Free your mind"}, {"m.title": "The Matrix Revolutions", "m.tagline": "Everything that has a beginning has an end"}, {"m.title": "The Devil's Advocate", "m.tagline": "Evil has its winning ways"}, {"m.title": "A Few Good Men", "m.tagline": "In the heart of the nation's capital, in a courthouse of the U.S. government, one man will stop at nothing to keep his honor, and one will stop at nothing to find the truth."}, {"m.title": "Top Gun", "m.tagline": "I feel the need, the need for speed."}, {"m.title": "Jerry Maguire", "m.tagline": "The rest of his life begins now."}, {"m.title": "Stand By Me", "m.tagline": "For some, it's the last real taste of innocence, and the first real taste of life. But for everyone, it's the time that memories are made of."}, {"m.title": "As Good as It Gets", "m.tagline": "A comedy from the heart that goes for the throat."}, {"m.title": "What Dreams May Come", "m.tagline": "After life there is more. The end is just the beginning."}, {"m.title": "Snow Falling on Cedars", "m.tagline": "First loves last. Forever."}, {"m.title": "You've Got Mail", "m.tagline": "At odds in life... in love on-line."}, {"m.title": "Sleepless in Seattle", "m.tagline": "What if someone you never met, someone you never saw, someone you never knew was the only someone for you?"}, {"m.title": "Joe Versus the Volcano", "m.tagline": "A story of love, lava and burning desire."}, {"m.title": "When Harry Met Sally", "m.tagline": "Can two friends sleep together and still love each other in the morning?"}, {"m.title": "That Thing You Do", "m.tagline": "In every life there comes a time when that thing you dream becomes that thing you do"}, {"m.title": "The Replacements", "m.tagline": "Pain heals, Chicks dig scars... Glory lasts forever"}, {"m.title": "RescueDawn", "m.tagline": "Based on the extraordinary true story of one man's fight for freedom"}, {"m.title": "The Birdcage", "m.tagline": "Come as you are"}, {"m.title": "Unforgiven", "m.tagline": "It's a hell of a thing, killing a man"}]
以下が映画のタイトルとキャッチフレーズの20件です:
- The Matrix - "Welcome to the Real World"
- The Matrix Reloaded - "Free your mind"
- The Matrix Revolutions - "Everything that has a beginning has an end"
- The Devil's Advocate - "Evil has its winning ways"
- A Few Good Men - "In the heart of the nation's capital, in a courthouse of the U.S. government, one man will stop at nothing to keep his honor, and one will stop at nothing to find the truth."
- Top Gun - "I feel the need, the need for speed."
- Jerry Maguire - "The rest of his life begins now."
- Stand By Me - "For some, it's the last real taste of innocence, and the first real taste of life. But for everyone, it's the time that memories are made of."
- As Good as It Gets - "A comedy from the heart that goes for the throat."
- What Dreams May Come - "After life there is more. The end is just the beginning."
- Snow Falling on Cedars - "First loves last. Forever."
- You've Got Mail - "At odds in life... in love on-line."
- Sleepless in Seattle - "What if someone you never met, someone you never saw, someone you never knew was the only someone for you?"
- Joe Versus the Volcano - "A story of love, lava and burning desire."
- When Harry Met Sally - "Can two friends sleep together and still love each other in the morning?"
- That Thing You Do - "In every life there comes a time when that thing you dream becomes that thing you do"
- The Replacements - "Pain heals, Chicks dig scars... Glory lasts forever"
- RescueDawn - "Based on the extraordinary true story of one man's fight for freedom"
- The Birdcage - "Come as you are"
- Unforgiven - "It's a hell of a thing, killing a man"
これらの映画には、印象的なキャッチフレーズが付けられていますね。何か特定の映画に関する詳細情報が必要でしたら、お知らせください。
プロンプト
これらの取得したタイトルとキャッチフレーズを日本語に翻訳してください
結果
先ほど取得した映画のタイトルとキャッチフレーズを日本語に翻訳します。
- マトリックス - "現実の世界へようこそ"
- マトリックス リローデッド - "あなたの心を解放せよ"
- マトリックス レボリューションズ - "始まりがあるものには、必ず終わりがある"
- デビル アドボケイト - "悪には勝利への道がある"
- ア フュー グッド メン - "国の中心部、米国政府の法廷で、一人の男は名誉を守るためなら何でもし、もう一人は真実を見つけるためなら何でもする"
- トップガン - "スピードが欲しい、スピードが必要だ"
- ジェリー・マグワイア - "彼の新しい人生が今始まる"
- スタンド・バイ・ミー - "ある人にとっては最後の無垢の味わい、そして人生の最初の味わい。しかし皆にとって、それは思い出が作られる時間"
- 恋愛小説家 - "心からの喜劇が喉元に迫る"
- ビヨンド・ドリームス - "命の後には続きがある。終わりは始まりに過ぎない"
- 雪に覆われた杉 - "初恋は続く。永遠に"
- ユー・ガット・メール - "現実では対立…オンラインでは恋愛中"
- めぐり逢えたら - "会ったこともなく、見たこともなく、知らない誰かがあなたにとっての唯一の誰かだったとしたら?"
- ジョー vs 火山 - "愛と溶岩と燃える欲望の物語"
- 恋人たちの予感 - "二人の友達が一緒に寝て、朝になっても愛し合えるだろうか?"
- すべてをあなたに - "人生には、夢見ていたことを実際に行動に移す時が来る"
- ザ・リプレイスメント - "痛みは癒え、女性は傷跡に惹かれる...栄光は永遠に続く"
- レスキュー・ドーン - "一人の男の自由のための闘いという驚くべき実話に基づく"
- 鳥かご - "ありのままに来なさい"
- 許されざる者 - "人を殺すというのは、大変なことだ"
これらの翻訳は文脈や日本での公式タイトルと完全に一致しない場合がありますが、意味を最大限に伝えるように翻訳しました。
LLMがCypherのクエリを作成し検索までできました。
今回は単純なクエリだったので関係性を見るようなクエリを試してみます。
プロンプト
スタンドバイミーの監督が関わった他の映画を調べてください
結果
スタンドバイミーの監督が関わった他の映画を調査しますね。まず、スタンドバイミーの監督を特定するところから始めましょう。
read_neo4j_cypher
リクエスト{ `query`: `MATCH (p:Person)-[r:DIRECTED]->(m:Movie {title: \"Stand By Me\"}) RETURN p.name` }
レスンポンス[{"p.name": "Rob Reiner"}]
スタンドバイミーの監督はロブ・ライナー(Rob Reiner)であることがわかりました。次に、ロブ・ライナーが監督した他の映画を検索します。
read_neo4j_cypher
リクエスト{ `query`: `MATCH (p:Person {name: \"Rob Reiner\"})-[r:DIRECTED]->(m:Movie) RETURN m.title, m.tagline, m.released ORDER BY m.released` }
レスポンス[{"m.title": "Stand By Me", "m.tagline": "For some, it's the last real taste of innocence, and the first real taste of life. But for everyone, it's the time that memories are made of.", "m.released": 1986}, {"m.title": "A Few Good Men", "m.tagline": "In the heart of the nation's capital, in a courthouse of the U.S. government, one man will stop at nothing to keep his honor, and one will stop at nothing to find the truth.", "m.released": 1992}, {"m.title": "When Harry Met Sally", "m.tagline": "Can two friends sleep together and still love each other in the morning?", "m.released": 1998}]
ロブ・ライナーが監督した映画は以下の3作品であることがわかりました:
スタンド・バイ・ミー(1986年)
- キャッチフレーズ:「ある人にとっては最後の無垢の味わい、そして人生の最初の味わい。しかし皆にとって、それは思い出が作られる時間」
ア・フュー・グッド・メン(1992年)
- キャッチフレーズ:「国の中心部、米国政府の法廷で、一人の男は名誉を守るためなら何でもし、もう一人は真実を見つけるためなら何でもする」
恋人たちの予感(When Harry Met Sally)(1998年)
- キャッチフレーズ:「二人の友達が一緒に寝て、朝になっても愛し合えるだろうか?」
データベース上ではロブ・ライナーの監督作品はこの3作品となっていますが、実際にはもっと多くの作品を監督していることは注意点として挙げておきます。この結果はデータベース内の情報に基づいています。
もう少し複雑なことをしてみます。
プロンプト
複数の映画で共演している俳優を調べてください。
結果
複数の映画で共演している俳優のペアを調査します。共演とは同じ映画に出演していることを意味するので、ACTED_IN関係を使って調べていきます。
read_neo4j_cypher
リクエスト{ `query`: ` MATCH (a:Person)-[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(b:Person) WHERE a.name < b.name // 重複を避けるため名前の順序を固定 WITH a, b, COLLECT(m.title) AS movies WHERE SIZE(movies) > 1 // 2つ以上の映画で共演 RETURN a.name, b.name, movies, SIZE(movies) AS movie_count ORDER BY movie_count DESC LIMIT 10 ` }
レスポンス[{"a.name": "Meg Ryan", "b.name": "Tom Hanks", "movies": ["You've Got Mail", "Sleepless in Seattle", "Joe Versus the Volcano"], "movie_count": 3}, {"a.name": "Hugo Weaving", "b.name": "Laurence Fishburne", "movies": ["The Matrix", "The Matrix Reloaded", "The Matrix Revolutions"], "movie_count": 3}, {"a.name": "Carrie-Anne Moss", "b.name": "Hugo Weaving", "movies": ["The Matrix", "The Matrix Reloaded", "The Matrix Revolutions"], "movie_count": 3}, {"a.name": "Hugo Weaving", "b.name": "Keanu Reeves", "movies": ["The Matrix", "The Matrix Reloaded", "The Matrix Revolutions"], "movie_count": 3}, {"a.name": "Carrie-Anne Moss", "b.name": "Keanu Reeves", "movies": ["The Matrix", "The Matrix Reloaded", "The Matrix Revolutions"], "movie_count": 3}, {"a.name": "Carrie-Anne Moss", "b.name": "Laurence Fishburne", "movies": ["The Matrix", "The Matrix Reloaded", "The Matrix Revolutions"], "movie_count": 3}, {"a.name": "Keanu Reeves", "b.name": "Laurence Fishburne", "movies": ["The Matrix", "The Matrix Reloaded", "The Matrix Revolutions"], "movie_count": 3}, {"a.name": "J.T. Walsh", "b.name": "Jack Nicholson", "movies": ["A Few Good Men", "Hoffa"], "movie_count": 2}, {"a.name": "Cuba Gooding Jr.", "b.name": "Tom Cruise", "movies": ["A Few Good Men", "Jerry Maguire"], "movie_count": 2}, {"a.name": "Cuba Gooding Jr.", "b.name": "Jack Nicholson", "movies": ["A Few Good Men", "As Good as It Gets"], "movie_count": 2}]
複数の映画で共演している俳優のペアを調査した結果、以下の組み合わせが見つかりました:
3作品で共演しているペア:
メグ・ライアン と トム・ハンクス
- 共演作品: 「ユー・ガット・メール」、「めぐり逢えたら」、「ジョー vs 火山」
マトリックス』シリーズの主要キャスト
- ヒューゴ・ウィーヴィング と ローレンス・フィッシュバーン
- キャリー・アン・モス と ヒューゴ・ウィーヴィング
- ヒューゴ・ウィーヴィング と キアヌ・リーブス
- キャリー・アン・モス と キアヌ・リーブス
- キャリー・アン・モス と ローレンス・フィッシュバーン
- キアヌ・リーブス と ローレンス・フィッシュバーン
- 共演作品: 「マトリックス」、「マトリックス リローデッド」、「マトリックス レボリューションズ」
2作品で共演しているペア:
J.T. ウォルシュ と ジャック・ニコルソン
- 共演作品: 「ア・フュー・グッド・メン」、「ホッファ」
キューバ・グッディング・Jr. と トム・クルーズ
- 共演作品: 「ア・フュー・グッド・メン」、「ジェリー・マグワイア」
キューバ・グッディング・Jr. と ジャック・ニコルソン
- 共演作品: 「ア・フュー・グッド・メン」、「恋愛小説家」
この結果から、最も多く共演しているペアはメグ・ライアンとトム・ハンクス、そして『マトリックス』シリーズの主要キャストであることがわかります。どのペアも3作品で共演しています。
複雑なCypherも生成して実行することができました。
まとめ
以上Neo4jのMCPサーバーを試してみました。
Cypherによるクエリの生成と実行が容易になるので多くの人がNeo4jからデータを取り出すことができそうです。