MATCH (sp:ServiceProvider)
WHERE (sp.name IS NOT NULL AND sp.name <> '')
AND COALESCE(sp.serviceType, sp.service_type, '') CONTAINS $serviceType
AND sp.city CONTAINS $city
RETURN COALESCE(sp.name, sp.office_name) AS name,
COALESCE(sp.corporateName, sp.corp_name, '') AS corporateName,
COALESCE(sp.serviceType, sp.service_type, '') AS serviceType,
sp.city AS city,
COALESCE(sp.address, sp.fullAddress, '') AS address,
sp.phone AS phone,
sp.capacity AS capacity,
COALESCE(sp.availability, '未確認') AS availability,
COALESCE(sp.closedDays, sp.closed_days, '') AS closedDays,
sp.hoursWeekday AS hoursWeekday
ORDER BY
CASE COALESCE(sp.availability, '未確認')
WHEN '空きあり' THEN 1
WHEN '要相談' THEN 2
WHEN '未確認' THEN 3
WHEN '満員' THEN 4
ELSE 5
END,
COALESCE(sp.name, sp.office_name)
LIMIT $limit
使い方: 条件を自由に組み合わせる。
サービス種類のみ: AND COALESCE(sp.serviceType, sp.service_type, '') CONTAINS '生活介護' のWHERE行のみ残す
地域のみ: AND sp.city CONTAINS '北九州' のWHERE行のみ残す
キーワード検索追加: AND (COALESCE(sp.name, sp.office_name, '') CONTAINS $keyword OR COALESCE(sp.corporateName, sp.corp_name, '') CONTAINS $keyword)
空き状況絞り込み: AND COALESCE(sp.availability, '未確認') = '空きあり'
旧形式も含める: WHERE (sp.name IS NOT NULL AND sp.name <> '') OR (sp.office_name IS NOT NULL AND sp.office_name <> '')
MATCH (c:Client)-[r:USES_SERVICE]->(sp:ServiceProvider)
WHERE c.name CONTAINS $clientName
RETURN COALESCE(sp.name, sp.office_name, sp.corporateName, '名称未登録') AS providerName,
COALESCE(sp.serviceType, sp.service_type, '') AS serviceType,
sp.phone AS phone,
r.status AS status,
r.startDate AS startDate,
r.endDate AS endDate,
r.note AS note
ORDER BY
CASE r.status
WHEN 'Active' THEN 1
WHEN 'Pending' THEN 2
WHEN 'Ended' THEN 3
ELSE 4
END,
r.startDate DESC
パラメータ:
$clientName: クライアント名(部分一致)
注意: USES_SERVICE関係が存在しない場合は空の結果が返る。
テンプレート3: 代替事業所検索
現在利用中のサービスと同種の事業所で、まだ利用していないものを検索する。
MATCH (c:Client)-[r:USES_SERVICE]->(current:ServiceProvider)
WHERE c.name CONTAINS $clientName
AND r.status = 'Active'
WITH c, collect(COALESCE(current.name, current.office_name)) AS currentNames,
collect(DISTINCT COALESCE(current.serviceType, current.service_type)) AS serviceTypes
UNWIND serviceTypes AS st
MATCH (alt:ServiceProvider)
WHERE COALESCE(alt.serviceType, alt.service_type, '') = st
AND COALESCE(alt.name, alt.office_name, '') <> ''
AND NOT COALESCE(alt.name, alt.office_name) IN currentNames
RETURN COALESCE(alt.name, alt.office_name) AS name,
COALESCE(alt.corporateName, alt.corp_name, '') AS corporateName,
COALESCE(alt.serviceType, alt.service_type, '') AS serviceType,
alt.city AS city,
alt.phone AS phone,
COALESCE(alt.availability, '未確認') AS availability,
alt.capacity AS capacity
ORDER BY
CASE COALESCE(alt.availability, '未確認')
WHEN '空きあり' THEN 1
WHEN '要相談' THEN 2
WHEN '未確認' THEN 3
WHEN '満員' THEN 4
ELSE 5
END,
COALESCE(alt.name, alt.office_name)
LIMIT 20
パラメータ:
$clientName: クライアント名(部分一致)
テンプレート4: 事業所の口コミ取得
MATCH (sp:ServiceProvider)-[:HAS_FEEDBACK]->(f:ProviderFeedback)
WHERE COALESCE(sp.name, sp.office_name, sp.corporateName, '') CONTAINS $providerName
RETURN f.category AS category,
f.content AS content,
f.rating AS rating,
f.source AS source,
f.date AS date
ORDER BY f.date DESC
LIMIT $limit
パラメータ:
$providerName: 事業所名(部分一致)
$limit: 取得件数(デフォルト20)
カテゴリ絞り込み: AND f.category = $category をWHEREに追加。
テンプレート5: 事業所の評価サマリー
MATCH (sp:ServiceProvider)-[:HAS_FEEDBACK]->(f:ProviderFeedback)
WHERE COALESCE(sp.name, sp.office_name, sp.corporateName, '') CONTAINS $providerName
WITH sp,
count(f) AS totalFeedbacks,
sum(CASE WHEN f.rating STARTS WITH '◎' THEN 1 ELSE 0 END) AS excellent,
sum(CASE WHEN f.rating STARTS WITH '○' THEN 1 ELSE 0 END) AS good,
sum(CASE WHEN f.rating STARTS WITH '△' THEN 1 ELSE 0 END) AS fair,
sum(CASE WHEN f.rating STARTS WITH '×' THEN 1 ELSE 0 END) AS poor,
avg(CASE
WHEN f.rating STARTS WITH '◎' THEN 4.0
WHEN f.rating STARTS WITH '○' THEN 3.0
WHEN f.rating STARTS WITH '△' THEN 2.0
WHEN f.rating STARTS WITH '×' THEN 1.0
ELSE 0.0
END) AS avgScore
RETURN COALESCE(sp.name, sp.office_name, sp.corporateName) AS providerName,
totalFeedbacks,
excellent, good, fair, poor,
round(avgScore * 100) / 100 AS avgScore
パラメータ:
$providerName: 事業所名(部分一致)
テンプレート6: 口コミ評価で事業所検索
特定カテゴリの口コミが良い事業所を探す。
MATCH (sp:ServiceProvider)-[:HAS_FEEDBACK]->(f:ProviderFeedback)
WHERE f.category = $category
WITH sp,
count(f) AS feedbackCount,
avg(CASE
WHEN f.rating STARTS WITH '◎' THEN 4.0
WHEN f.rating STARTS WITH '○' THEN 3.0
WHEN f.rating STARTS WITH '△' THEN 2.0
WHEN f.rating STARTS WITH '×' THEN 1.0
ELSE 0.0
END) AS avgScore,
collect(f.content)[0..3] AS topExamples
WHERE feedbackCount >= 1
RETURN COALESCE(sp.name, sp.office_name, sp.corporateName) AS providerName,
COALESCE(sp.serviceType, sp.service_type, '') AS serviceType,
sp.city AS city,
COALESCE(sp.availability, '未確認') AS availability,
feedbackCount,
round(avgScore * 100) / 100 AS avgScore,
topExamples
ORDER BY avgScore DESC, feedbackCount DESC
LIMIT $limit
サービス種類: AND COALESCE(sp.serviceType, sp.service_type, '') CONTAINS $serviceType
地域: AND sp.city CONTAINS $city
── 書き込み系(write_neo4j_cypher) ──
テンプレート7: クライアントと事業所の紐付け
MERGE (c:Client {name: $clientName})
MERGE (sp:ServiceProvider {name: $providerName})
MERGE (c)-[r:USES_SERVICE]->(sp)
ON CREATE SET
r.startDate = $startDate,
r.status = $status,
r.note = $note
ON MATCH SET
r.status = $status,
r.note = $note,
r.endDate = CASE WHEN $status = 'Ended' THEN toString(date()) ELSE r.endDate END
RETURN c.name AS client, sp.name AS provider, r.status AS status, r.startDate AS startDate
MATCH (sp:ServiceProvider)
WHERE COALESCE(sp.name, sp.office_name, sp.corporateName, '') CONTAINS $providerName
WITH sp LIMIT 1
SET sp.availability = $availability,
sp.updatedAt = toString(datetime())
WITH sp, $currentUsers AS newUsers
FOREACH (_ IN CASE WHEN newUsers >= 0 THEN [1] ELSE [] END |
SET sp.currentUsers = newUsers
)
RETURN COALESCE(sp.name, sp.office_name, sp.corporateName) AS provider,
sp.availability AS availability,
sp.currentUsers AS currentUsers,
sp.updatedAt AS updatedAt
パラメータ:
$providerName: 事業所名(部分一致で最初の1件にマッチ)
$availability: 空き状況(空きあり / 要相談 / 満員 / 未確認)
$currentUsers: 現在利用者数(-1の場合は更新しない)
運用ガイドライン
検索のベストプラクティス
名前付きレコードのみ検索: 最初のWHERE句に sp.name IS NOT NULL AND sp.name <> '' を入れる
旧形式も含める場合: (sp.name <> '' OR sp.office_name <> '') に変更