用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/kazumasakawahara/neo4j-agno-agent --skill neo4j-support-db命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
支援記録・家族聴き取り・面談書き起こし・生育歴ナラティブなど、物語調テキストから4段階プロトコル(抽出→検証→プレビュー→登録)でNeo4jに構造化保存するスキル。EXTRACTION_PROMPT準拠、禁忌抵触チェック、監査ログ自動記録、冪等登録(sourceHash)、長文チャンキングに対応。
Analyzes support logs to discover effective care strategies and suggests formalizing them.
Manage the transition of care roles when a key person (parent) becomes unable to fulfill them.
基于 SOC 职业分类
正在显示 SKILL.md
| name | neo4j-support-db |
| description | 知的障害・精神障害のある方の支援情報を包括的に管理するNeo4jグラフデータベース。汎用neo4j MCPツールを通じてCypherクエリを実行し、計画相談支援業務を支援する。 |
このスキルは、知的障害・精神障害のある方の支援情報を包括的に管理するNeo4jグラフデータベースに、汎用neo4j MCPツールを通じてアクセスし、計画相談支援業務を支援します。
対象ユーザー: 計画相談支援専門員、障害福祉サービス事業者、支援コーディネーター
主な機能:
注意: 緊急時対応は emergency-protocol スキルを使用してください。
| ツール | 用途 |
|---|---|
neo4j:read_neo4j_cypher | すべての読み取りクエリ |
neo4j:write_neo4j_cypher | データの登録・更新 |
neo4j:get_neo4j_schema | スキーマ確認(必要時のみ) |
| ノード | 用途 | 主要プロパティ |
|---|---|---|
:Client | 本人 | name, dob, bloodType |
:LifeHistory | 生育歴 | era, episode |
:Wish | 願い | content, status |
| ノード | 用途 | 主要プロパティ |
|---|---|---|
:CarePreference | 推奨ケア | category, instruction, priority |
:NgAction | 禁忌事項 ★最重要★ | action, reason, riskLevel |
:Condition | 特性・診断 | name, status |
| ノード | 用途 | 主要プロパティ |
|---|---|---|
:Certificate | 手帳・受給者証 | type, grade, nextRenewalDate |
:PublicAssistance | 公的扶助 | type, grade |
| ノード | 用途 | 主要プロパティ |
|---|---|---|
:KeyPerson | キーパーソン | name, relationship, phone, role |
:Guardian | 法的代理人 | name, type, phone, organization |
:Supporter | 支援者 | name, role, organization |
:Hospital | 医療機関 | name, specialty, doctor, phone |
| ノード | 用途 | 主要プロパティ |
|---|---|---|
:SupportLog | 支援記録 | date, situation, action, effectiveness, note, type, duration, nextAction |
:AuditLog | 監査ログ | timestamp, user, action, targetType, targetName, details, clientName |
| リレーション | 方向 | プロパティ |
|---|---|---|
MUST_AVOID | Client → NgAction | — |
REQUIRES | Client → CarePreference | — |
HAS_CONDITION | Client → Condition | diagnosedDate, severity |
HAS_KEY_PERSON | Client → KeyPerson | rank(優先順位) |
HAS_LEGAL_REP | Client → Guardian | — |
HAS_CERTIFICATE | Client → Certificate | issuedDate, status |
RECEIVES | Client → PublicAssistance | — |
HAS_HISTORY | Client → LifeHistory | — |
HAS_WISH | Client → Wish | — |
TREATED_AT | Client → Hospital | since, status |
SUPPORTED_BY | Client → Supporter | since, until |
LOGGED | Supporter → SupportLog | — |
ABOUT | SupportLog → Client | — |
IN_CONTEXT | NgAction → Condition | — |
ADDRESSES | CarePreference → Condition | — |
AUDIT_FOR | AuditLog → Client | — |
FOLLOWS | SupportLog → SupportLog | — |
全クライアントの情報登録状況を一覧表示する。
MATCH (c:Client)
OPTIONAL MATCH (c)-[:MUST_AVOID]->(ng:NgAction)
OPTIONAL MATCH (c)-[:REQUIRES]->(cp:CarePreference)
OPTIONAL MATCH (c)-[:HAS_KEY_PERSON]->(kp:KeyPerson)
OPTIONAL MATCH (c)-[:HAS_CERTIFICATE]->(cert:Certificate)
OPTIONAL MATCH (c)-[:HAS_LEGAL_REP]->(g:Guardian)
RETURN
c.name AS 氏名,
c.dob AS 生年月日,
count(DISTINCT ng) AS 禁忌登録数,
count(DISTINCT cp) AS 配慮事項数,
count(DISTINCT kp) AS キーパーソン数,
count(DISTINCT cert) AS 手帳数,
count(DISTINCT g) AS 後見人
ORDER BY c.name
出力加工: 生年月日から年齢を計算して 生年月日(年齢) として併記すること。
例: 1995-03-15 → 1995-03-15(30歳)
マニフェスト4本柱すべての情報を1クエリで取得する。
MATCH (c:Client)
WHERE c.name CONTAINS $clientName
// 第1の柱:本人性
OPTIONAL MATCH (c)-[:HAS_HISTORY]->(h:LifeHistory)
OPTIONAL MATCH (c)-[:HAS_WISH]->(w:Wish)
// 第2の柱:ケアの暗黙知
OPTIONAL MATCH (c)-[:HAS_CONDITION]->(con:Condition)
OPTIONAL MATCH (c)-[:REQUIRES]->(cp:CarePreference)
OPTIONAL MATCH (c)-[:MUST_AVOID]->(ng:NgAction)
// 第3の柱:法的基盤
OPTIONAL MATCH (c)-[:HAS_CERTIFICATE]->(cert:Certificate)
OPTIONAL MATCH (c)-[:RECEIVES]->(pa:PublicAssistance)
// 第4の柱:危機管理ネットワーク
OPTIONAL MATCH (c)-[kpRel:HAS_KEY_PERSON]->(kp:KeyPerson)
OPTIONAL MATCH (c)-[:HAS_LEGAL_REP]->(g:Guardian)
OPTIONAL MATCH (c)-[:SUPPORTED_BY]->(s:Supporter)
OPTIONAL MATCH (c)-[:TREATED_AT]->(hosp:Hospital)
RETURN
c.name AS 氏名,
c.dob AS 生年月日,
c.bloodType AS 血液型,
collect(DISTINCT {era: h.era, episode: h.episode}) AS 生育歴,
collect(DISTINCT {content: w.content, status: w.status}) AS 願い,
collect(DISTINCT {name: con.name, status: con.status}) AS 特性_診断,
collect(DISTINCT {category: cp.category, instruction: cp.instruction, priority: cp.priority}) AS 配慮事項,
collect(DISTINCT {action: ng.action, reason: ng.reason, riskLevel: ng.riskLevel}) AS 禁忌事項,
collect(DISTINCT {type: cert.type, grade: cert.grade, nextRenewalDate: cert.nextRenewalDate}) AS 手帳_受給者証,
collect(DISTINCT {type: pa.type, grade: pa.grade}) AS 公的扶助,
collect(DISTINCT {rank: kpRel.rank, name: kp.name, relationship: kp.relationship, phone: kp.phone, role: kp.role}) AS キーパーソン,
collect(DISTINCT {name: g.name, type: g.type, phone: g.phone}) AS 後見人等,
collect(DISTINCT {name: s.name, role: s.role, organization: s.organization}) AS 支援者,
collect(DISTINCT {name: hosp.name, specialty: hosp.specialty, phone: hosp.phone}) AS 医療機関
パラメータ: $clientName
出力加工:
nullのエントリを除外するrank昇順でソート【基本情報】氏名 / 生年月日(年齢)/ 血液型
【第1の柱:本人性】生育歴、願い
【第2の柱:ケアの暗黙知】特性・診断、配慮事項、🚫禁忌事項
【第3の柱:法的基盤】手帳・受給者証、公的扶助
【第4の柱:危機管理ネットワーク】キーパーソン、後見人等、支援者、医療機関
各ノードタイプの登録数を確認する。1つのクエリで一括取得。
MATCH (n)
WHERE n:Client OR n:NgAction OR n:CarePreference OR n:Condition
OR n:KeyPerson OR n:Certificate OR n:Guardian OR n:LifeHistory
OR n:Wish OR n:Hospital OR n:Supporter OR n:SupportLog
WITH labels(n)[0] AS label
RETURN label AS ノード種別, count(*) AS 登録数
ORDER BY 登録数 DESC
MATCH (c:Client)-[:HAS_CERTIFICATE]->(cert:Certificate)
WHERE cert.nextRenewalDate IS NOT NULL
AND ($clientName = '' OR c.name CONTAINS $clientName)
WITH c, cert,
duration.inDays(date(), cert.nextRenewalDate).days AS daysUntilRenewal
WHERE daysUntilRenewal <= $days AND daysUntilRenewal >= 0
RETURN
c.name AS クライアント,
cert.type AS 証明書種類,
cert.grade AS 等級,
cert.nextRenewalDate AS 更新期限,
daysUntilRenewal AS 残り日数
ORDER BY daysUntilRenewal ASC
パラメータ: $clientName(空文字で全員), $days(デフォルト90)
出力加工: 残り日数で緊急度をグループ化:
MATCH (s:Supporter)-[:LOGGED]->(log:SupportLog)-[:ABOUT]->(c:Client)
WHERE c.name CONTAINS $clientName
RETURN log.date AS 日付,
s.name AS 支援者,
log.situation AS 状況,
log.action AS 対応,
log.effectiveness AS 効果,
log.note AS メモ
ORDER BY log.date DESC
LIMIT $limit
パラメータ: $clientName, $limit(デフォルト10、最大50)
複数回効果があった対応方法を自動検出する。
MATCH (s:Supporter)-[:LOGGED]->(log:SupportLog)-[:ABOUT]->(c:Client)
WHERE c.name CONTAINS $clientName
AND (toLower(toString(log.effectiveness)) STARTS WITH 'effective'
OR toLower(toString(log.effectiveness)) STARTS WITH 'excellent'
OR toString(log.effectiveness) CONTAINS '効果')
WITH log.action AS 対応方法, count(*) AS 回数,
collect(DISTINCT log.situation) AS 状況一覧
WHERE 回数 >= $minFrequency
RETURN 対応方法, 回数, 状況一覧
ORDER BY 回数 DESC
パラメータ: $clientName, $minFrequency(デフォルト2)
MATCH (al:AuditLog)
WHERE ($clientName = '' OR al.clientName CONTAINS $clientName)
AND ($userName = '' OR al.user CONTAINS $userName)
RETURN al.timestamp AS 日時,
al.user AS 操作者,
al.action AS 操作,
al.targetType AS 対象種別,
al.targetName AS 対象名,
al.details AS 詳細,
al.clientName AS クライアント
ORDER BY al.timestamp DESC
LIMIT $limit
パラメータ: $clientName(空文字OK), $userName(空文字OK), $limit(デフォルト30、最大100)
特定クライアントに絞った監査ログ。
MATCH (al:AuditLog)
WHERE al.clientName CONTAINS $clientName
RETURN al.timestamp AS 日時,
al.user AS 操作者,
al.action AS 操作,
al.targetType AS 対象種別,
al.targetName AS 内容,
al.details AS 詳細
ORDER BY al.timestamp DESC
LIMIT $limit
パラメータ: $clientName, $limit(デフォルト20)
データの登録・更新には neo4j:write_neo4j_cypher を使用する。
【重要】長文ナラティブ・家族聴き取り・面談書き起こしなど、複数ノード+リレーションをまとめて構造化する場合は、本スキルの単発Cypher方式ではなく
narrative-intakeスキルを優先して使用してください。 本セクションは短い単発の支援記録(1イベント相当)を対象とします。
旧システムでは Gemini API で支援記録テキストを構造化していたが、スキルベースの新システムでは Claude自身がテキストを構造化 してからCypherで登録する。必ず以下の4段階を守ること。
Phase 1: 抽出(Extraction)
situation: 何が起きたか(状況)action: どう対応したか(対応)effectiveness: 効果があったか(Effective / Ineffective / Neutral / Unknown)note: その他のメモPhase 2: 検証(Validation)
抽出結果が以下のスキーマ規約に準拠しているか Claude 自身で必ず確認すること(違反があれば落として警告):
docs/NEO4J_SCHEMA_CONVENTION.md の許可リストのみ(PascalCase)MUST_AVOID, LOGGED, ABOUT, REQUIRES など許可リストのみ(UPPER_SNAKE_CASE)^[a-zA-Z_][a-zA-Z0-9_]*$ にマッチすること(日本語キー禁止)Effective, Panic, LifeThreatening 等)YYYY-MM-DD に変換(和暦は必ず変換)Phase 3: プレビュー(Preview)— ユーザー承認を必ず取る
登録前に以下のフォーマットで内容を提示し、ユーザーの明示的承認を待つこと:
【登録プレビュー】
対象クライアント: 山田健太
日付: 2026-04-12
支援者: 鈴木
─────────────────────────
■ SupportLog(新規)
situation: パニック発生
action: イヤーマフ装着
effectiveness: Effective
note: 5分で落ち着いた
■ NgAction(追加候補)
action: 突然の大きな音
riskLevel: Panic
⚠️ 既存禁忌事項との抵触: なし
この内容で登録してよろしいですか?
Phase 4: 登録+監査(Write & Audit)
承認後、以下を 1 セットで 実行する:
登録前に、対象クライアントの既存 NgAction を読み取って、ナラティブ内の行動が抵触していないかを Claude 自身で判定すること。
MATCH (c:Client)-[:MUST_AVOID]->(ng:NgAction)
WHERE c.name CONTAINS $clientName
RETURN ng.action AS 禁忌行動, ng.riskLevel AS リスクレベル, ng.reason AS 理由
抵触が疑われる場合、プレビューに ⚠️ 禁忌抵触の可能性: 禁忌事項「〜」に該当する行動が記録されています と赤字相当の強調で表示し、登録可否をユーザーに再確認する。
例: 「今日、急な音に驚いてパニックになりました。テレビを消して静かにしたら5分で落ち着きました。」 → situation: "急な音に驚いてパニック" → action: "テレビを消して静かにした" → effectiveness: "Effective" → note: "5分で落ち着いた"
MATCH (c:Client)
WHERE c.name CONTAINS $clientName
MERGE (s:Supporter {name: $supporterName})
CREATE (log:SupportLog {
date: date($date),
situation: $situation,
action: $action,
effectiveness: $effectiveness,
note: $note,
type: $type,
duration: $duration,
nextAction: $nextAction
})
MERGE (s)-[:LOGGED]->(log)
MERGE (log)-[:ABOUT]->(c)
// 前回の支援記録との時系列チェーン
WITH log, c
OPTIONAL MATCH (prevLog:SupportLog)-[:ABOUT]->(c)
WHERE prevLog <> log AND prevLog.date <= log.date
WITH log, prevLog ORDER BY prevLog.date DESC LIMIT 1
FOREACH (_ IN CASE WHEN prevLog IS NOT NULL THEN [1] ELSE [] END |
CREATE (log)-[:FOLLOWS]->(prevLog)
)
RETURN log.date AS 日付, log.situation AS 状況
パラメータ:
$clientName: クライアント名$supporterName: 支援者名(不明の場合は "不明")$date: 日付(YYYY-MM-DD形式、不明なら今日の日付)$situation, $action, $effectiveness, $note$type: 記録種別(日常記録 / インシデント / 会議 / 引き継ぎ、デフォルト: 日常記録)$duration: 対応時間(分単位、不明の場合は null)$nextAction: 次回フォローアップ内容(任意)MATCH (c:Client)
WHERE c.name CONTAINS $clientName
MERGE (ng:NgAction {
action: $action,
reason: $reason,
riskLevel: $riskLevel
})
MERGE (c)-[:MUST_AVOID]->(ng)
RETURN ng.action AS 禁忌事項, ng.riskLevel AS リスクレベル
パラメータ: $clientName, $action, $reason, $riskLevel (LifeThreatening / Panic / Discomfort)
MATCH (c:Client)
WHERE c.name CONTAINS $clientName
MERGE (cp:CarePreference {
category: $category,
instruction: $instruction,
priority: $priority
})
MERGE (c)-[:REQUIRES]->(cp)
RETURN cp.category AS カテゴリ, cp.instruction AS 手順
パラメータ: $clientName, $category, $instruction, $priority (High / Medium / Low)
MATCH (c:Client)
WHERE c.name CONTAINS $clientName
MERGE (kp:KeyPerson {
name: $name,
relationship: $relationship,
phone: $phone,
role: $role
})
MERGE (c)-[:HAS_KEY_PERSON {rank: $rank}]->(kp)
RETURN kp.name AS 名前, kp.relationship AS 続柄
パラメータ: $clientName, $name, $relationship, $phone, $role, $rank(優先順位番号)
MATCH (c:Client)
WHERE c.name CONTAINS $clientName
MERGE (cert:Certificate {
type: $type,
grade: $grade,
nextRenewalDate: date($nextRenewalDate)
})
MERGE (c)-[:HAS_CERTIFICATE]->(cert)
RETURN cert.type AS 種類, cert.grade AS 等級, cert.nextRenewalDate AS 更新日
データ変更時には必ず監査ログを残す。AUDIT_FOR リレーションで Client に自動接続される。
CREATE (al:AuditLog {
timestamp: datetime(),
user: $user,
action: $action,
targetType: $targetType,
targetName: $targetName,
details: $details,
clientName: $clientName
})
WITH al
OPTIONAL MATCH (c:Client {name: $clientName})
WHERE $clientName <> ''
FOREACH (_ IN CASE WHEN c IS NOT NULL THEN [1] ELSE [] END |
CREATE (al)-[:AUDIT_FOR]->(c)
)
RETURN al.timestamp AS 記録日時
パラメータ: $user(操作者名), $action(例: "CREATE", "UPDATE"), $targetType(例: "SupportLog", "NgAction"), $targetName(内容の要約), $details(詳細), $clientName
キーワードで支援記録を横断検索する。全文検索インデックスを使用。
CALL db.index.fulltext.queryNodes('idx_supportlog_fulltext', $keyword)
YIELD node, score
MATCH (s:Supporter)-[:LOGGED]->(node)-[:ABOUT]->(c:Client)
WHERE $clientName = '' OR c.name CONTAINS $clientName
RETURN node.date AS 日付,
s.name AS 支援者,
c.name AS クライアント,
node.situation AS 状況,
node.action AS 対応,
node.effectiveness AS 効果,
score AS スコア
ORDER BY score DESC
LIMIT $limit
パラメータ: $keyword(検索キーワード), $clientName(空文字で全員), $limit(デフォルト20)
注意: 全文検索は日本語の形態素解析に制限があります。単語単位の検索に適していますが、部分文字列マッチには
CONTAINSを併用してください。
同一クライアントの支援記録を FOLLOWS リレーションで時系列に追跡する。
MATCH (log:SupportLog)-[:ABOUT]->(c:Client)
WHERE c.name CONTAINS $clientName
OPTIONAL MATCH (log)-[:FOLLOWS]->(prev:SupportLog)
RETURN log.date AS 日付,
log.situation AS 状況,
log.action AS 対応,
log.effectiveness AS 効果,
log.type AS 種別,
prev.date AS 前回記録日
ORDER BY log.date DESC
LIMIT $limit
パラメータ: $clientName, $limit(デフォルト20)
PDFやExcelのレポート生成が必要な場合は、以下の別スキルを使用する:
| 出力形式 | 使用スキル | 内容 |
|---|---|---|
pdf スキル | 緊急時情報シート(A4 1枚) | |
| Excel | xlsx スキル | 詳細データシート(全データ) |
手順: まずこのスキルのテンプレート2(プロフィール一括取得)でデータを取得し、PDFまたはExcelスキルに渡して整形する。
「パニック」「事故」「急病」「緊急」などのワードを検知したら、このスキルではなく emergency-protocol スキルを即座に起動すること。
生年月日(dob)が取得できた場合、必ず現在の年齢を計算して併記する。
例: 1995-03-15 → 1995-03-15(30歳)
クライアント情報を表示する際、NgAction(禁忌事項)が存在する場合は 最初に強調表示 すること。
ユーザーから支援記録テキストを受け取った場合:
EffectiveIneffectiveNeutralデータの新規登録や更新を行う前に、登録内容をユーザーに確認すること。特に:
すべてのクエリで $param 形式のパラメータを使用すること。文字列連結によるCypher構築は禁止(インジェクション対策)。
ユーザー: 「山田健太さんの情報を全部見せて」
手順:
1. テンプレート2(プロフィール一括)を実行
→ $clientName = "山田健太"
2. 4本柱の構造に沿って整形表示
3. 不足情報(更新期限切れの手帳、未登録のキーパーソン等)を指摘
ユーザー: 「山田健太さんの記録: 今日パニックになったけど、イヤーマフをつけたら5分で落ち着いた」
手順:
1. テキストを構造化:
- situation: "パニック発生"
- action: "イヤーマフを装着"
- effectiveness: "Effective"
- note: "5分で落ち着いた"
2. 登録内容を確認提示
3. 承認後、支援記録の書き込みCypherを実行
4. 監査ログを記録
ユーザー: 「山田健太さんに効果的だった対応を教えて」
手順:
1. テンプレート6(ケアパターン発見)を実行
→ $clientName = "山田健太", $minFrequency = 2
2. パターンがない場合はテンプレート5(支援記録取得)で最新記録を表示
3. 効果的だった対応と逆効果だった対応を分類して提示
ユーザー: 「来月更新期限を迎える手帳は?」
手順:
1. テンプレート4(更新期限チェック)を実行
→ $clientName = "", $days = 30
2. 緊急度別にグループ化して表示
3. 更新手続きの流れを補足
クエリ結果が空の場合:
1. テンプレート1(クライアント一覧)を実行して候補を提示
2. 「もしかして: 〇〇さん?」と表示
| スキル | 連携タイミング |
|---|---|
emergency-protocol | 緊急ワード検知時に即座に切り替え |
livelihood-support | 経済的リスク・金銭管理の確認(生活保護受給者の場合) |
ecomap-generator | 支援ネットワーク図の生成 |
provider-search | 事業所検索・利用状況の確認 |
pdf / xlsx | レポート出力時 |
このデータベースは単なる情報管理ツールではなく、クライアントの権利擁護のためのツールです。