はじめに

本記事では、GakuNin RDM(Research Data Management)とDydra RDFデータベースを連携させた、研究データのメタデータ管理システムの開発について解説します。このシステムは、研究プロジェクトのファイル管理とDublin Coreメタデータの登録・検索を統合的に扱うことができます。

システム概要

アーキテクチャ

GakRAN(uDPeANMIxpitpn.jRsou1tD4eyRrdDD)rFBa

主要技術スタック:

  • Next.js 14 (App Router)
  • NextAuth.js (OAuth 2.0認証)
  • Dydra (RDFデータベース)
  • GakuNin RDM API
  • SPARQL (クエリ言語)

1. GakuNin RDMとの連携

1.1 OAuth 2.0認証の実装

GakuNin RDMはOAuth 2.0による認証をサポートしています。NextAuth.jsを使用してこれを実装しました。

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

1.2 トークンの自動リフレッシュ

長時間のセッションを維持するため、アクセストークンの自動リフレッシュ機能を実装しました。

a}syi}i}rnffectttcci}t(ooo(oofujakkktnncr}rwceeeoss(oe;ntcnnnkttsntare(o...ehsucext{uarencsotr.cfponcex.uhunterikttcfperolrosereo)erixrude{kssenkserpelRfeThs;e{sseindernoTAnThsrtRfe,kot,oTAeTersek:kotsifehneaek5Amrse:nMcne=teehd:acn)sTrto=a=h&oerhu=c{&kfe.nacM=erfftcaoatnerl,ccutcosseoocnhukhsouuot.re=ehrsnu.frnde(etnele.aTdDr.txonrwoTaa.poteakot}crirTfieke)cer(irtne.efeDmesnn{srsaesr.sose_thea.w_sae>Tfcr(tht.=orce)o_;nkeefktotessr/eowonhsenk(k)A_s1;e)ecth0nn{co_0;/.ekt0eseo)1xsnk0pT,e+0ion0rkr)ee?e;sn?fA(rttteoos-kkheee3nnd0..T0rro;eekfferrneesss.hheTTxoopkkieernne),s;_in,

1.3 プロジェクトとファイルの取得

GakuNin RDM APIを通じて、ユーザーのプロジェクト一覧とファイルを取得します。

c)c)o;o;n"{}n`{}shshtth}tth}te,te,rpaAfpaAesduisdus:etl:etprhe/rh/sos/sona:rRa:rspiepiei{zsi{z.ap.a=rtortdindiamosmow.ne.nan:n:ii=iti`i`.Ba.Bfaewaeecaacat.ri.rcjetjehprpr(/f/v$ev$2{t2{/sc/suehness(osesdsrieisoso/n/nm.$.ea{a/cpcncrcoeoedsjsesessTcT/oto?kIkfedein}nl}/}t`f`e,i,rl[ecsa/t$e{gporroyv]i=dperro}j/e`c,t",

2. Dydra RDFデータベースの活用

2.1 非公開データの管理

Dydraは本来公開RDFデータベースですが、APIトークンを使用することで非公開データの管理が可能です。

環境変数の設定:

DDDYYYDDDRRRAAA___ARACEPCPIOO_USTNIOTTK=OEyRNoY=u=yryo-ouaurcr-c-soreuecnprtoesti-ttoorkyen

APIトークンを使用したクエリ:

c)o;n`{}shttmh}b}tee,o)rpta''dq,eshdAAyus:oecu:epdrctr/:sehnynd:poe:sy'trwedP{'isrO:zUp=aSaRa.T'tLrac'aiSqwo,poelampnaQi/l'rut$i:ce{chrfaa`PyectBa,tciercooaahunrm(n/estsr(}p{/a$$r{{qprlre-oprcoeesssiustl.otersny+v}j./sDsoYpnDa'Rr,Aq_lA`P,I_TOKEN}`,

2.2 Named Graphによるデータ分離

Named Graphを使用することで、プロジェクトごとにデータを論理的に分離します。

Named Graphの設計:

GakuNin RDM APIから得られるリソースURIをそのままNamed Graph URIとして使用することで、データの出所とグラフの対応を明確にしています。

:https://api.rdm.nii.ac.jp/v2/nodes/{projectId}/

プロジェクトに関連するすべてのデータ(メタデータ、SKOS主題、プロファイル)を単一のNamed Graphに統合することで、以下のメリットがあります:

  • シンプルなクエリ : 複数グラフをUNIONで結合する必要がない
  • 効率的な検索 : メタデータとSKOS主題の横断検索が容易
  • データの一貫性 : すべてのデータが同じグラフ内で管理される
  • 外部システムとの相互運用性 : RDMのリソースURIとRDFグラフの直接的な対応
  • 管理の簡素化 : グラフURIの統一による運用負荷の軽減

例えば、メタデータのdc:subjectでSKOS概念を参照している場合、同一グラフ内なので直接JOINして主題ラベルを取得できます:

SFW}ERHLOE??EMRfsCEiuT<lbh{ej?teftddcipcctls::e:tss/iuk?/tbotaljsipee:ticpl.?trertedi?f?mtsLs.luaunebbbijeji;ele.ccat?tcsL..uajbbpje/elvc2t/Lnaobdeels/.{projectId}/>

メタデータ登録時のNamed Graph指定:

cc`oo;nnPPI}ssRRNttEESG}FFERgiIIRA<rnXXTP$asH{ddddpeddDrcccchrccA<e::::Ut:tT$stcdsrQeA{oireuiu<rgutesbehm{rrlacj=rtsacetreyt:peoic`phU"rpth=:<Ur$tt/hri{"i<t`/ti}m$o$ppt}>e{n{sup>tmm:r:aae"e/l{dt$t/.daa{aapctdmdprutaaeaigre.ttt./lrtaaard.mi.d.dcstcasmr:lrtu.egBeeabnl/i}a.jiedb"tdeimcloec.e/i;rstanto}c}cteg"r>.srrij/ma;pp1spt/./hiv1>io2/cn/>R}ne"osdo;eusr/c$e{p;rojectId}/`;

プロジェクト単位での検索:

cc`oo;nnPPSFW}ssRRERHttEELOE?OFFFEMRrPIgsIICEeddTLreXXT<sccITaa${o::OEprdd?{utcNRhcccrgrirA(Uh:tercteLCrQesaelaOiu<ropet{NehmuhaoT=rtsrU?r?Ayt:crdtrI`peici?eNh=:<}ttcsSt/h?>elro(t`/ttreeuLpptimarCsupts;tcA:r:l:oeS/leBrE/.id(ap?b.c?prucl:tigrridi./leoetrd.agsldctrcemroar).egrpi,nl/hpied?itLimcdciC.e/eRoAantsenSctecsE.srro?(j/miud"p1spre$/./tcs{v1>ieck2/ore/>n;iynpwotodireodsn}/"$}){)p)rojectId}/`;

2.3 Dublin Coreメタデータスキーマ

Dublin Core 15要素を完全にサポートしています。

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

0

3. メタデータの登録と検索

3.1 メタデータ登録フロー

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

1

登録API実装:

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

2

3.2 高度な検索機能

複数のDublin Coreフィールドを横断したキーワード検索を実装しています。

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

3

4. SKOS主題階層管理

4.1 SKOS概念スキーマの実装

主題の階層構造を管理するため、SKOS(Simple Knowledge Organization System)を採用しました。

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

4

SKOS登録のSPARQLクエリ:

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

5

4.2 階層構造の取得と主題ラベルの活用

統合グラフにより、メタデータと主題の関連を簡単にクエリできます:

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

6

5. プロジェクトRDFエクスポート機能

5.1 プロジェクト全体のRDFデータ取得

統合グラフにより、すべてのデータ(メタデータ、SKOS主題、プロファイル)を単一のCONSTRUCTクエリでエクスポートできます。

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

7

6. UIコンポーネントの設計

6.1 メタデータエディタ

Dublin Core 15要素すべてを編集可能なフォームコンポーネントを実装しています。

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

8

6.2 検索インターフェース

キーワード検索とフィールド別検索の両方をサポートしています。

e}x;pp]sor,rro{}ctv,/iintcca}tuacddayllu,ospoe:mpiitup}kepnreeeehra,er/ss"::nnolrsrniat:gttr:ace:npa""ISimosfia[kGodez"spp"o/uuaa:cah:eoh:atnkurtt:ntuhiutpeit{st"tOnNhrtop"ephhp"i"o:nso_st/t,n,c::st:t[iep/fy/p.oRsr{/.p/s.nDsoafea:.sM.ccu:c/n:"eeclce,nsol"axNvsu_cupte..nroniaxGetedt.utAnsaesrtAKv.d".dhuU.r,rm]tNGdod./hIAmsmnaONK.f.iup_Un.nittCNifi.hiLIiuiaOoIN.l.cpnE_ala.tsNCc_cjiTL.w.po=_Ijrj/nIEpips{DN/t/2.,Toeo/t_a"ausSu,usEtteChhrR22sE///Tatm,uoetk/he"on,r"i,ze",

9

7. セキュリティとパフォーマンス

7.1 認証とアクセス制御

  • すべてのAPIエンドポイントでセッション検証
  • アクセストークンの自動リフレッシュ
  • Named Graphによるプロジェクト単位のデータ分離

7.2 パフォーマンス最適化

  • Next.js App Routerによるサーバーサイドレンダリング
  • SPARQL クエリの最適化(OPTIONAL句の活用)
  • トークンリフレッシュの先行実行(有効期限5分前)

8. デプロイとインフラ

8.1 Vercelへのデプロイ

a}syi}i}rnffectttcci}t(ooo(oofujakkktnncr}rwceeeoss(oe;ntcnnnkttsntare(o...ehsucext{uarencsotr.cfponcex.uhunterikttcfperolrosereo)erixrude{kssenkserpelRfeThs;e{sseindernoTAnThsrtRfe,kot,oTAeTersek:kotsifehneaek5Amrse:nMcne=teehd:acn)sTrto=a=h&oerhu=c{&kfe.nacM=erfftcaoatnerl,ccutcosseoocnhukhsouuot.re=ehrsnu.frnde(etnele.aTdDr.txonrwoTaa.poteakot}crirTfieke)cer(irtne.efeDmesnn{srsaesr.sose_thea.w_sae>Tfcr(tht.=orce)o_;nkeefktotessr/eowonhsenk(k)A_s1;e)ecth0nn{co_0;/.ekt0eseo)1xsnk0pT,e+0ion0rkr)ee?e;sn?fA(rttteoos-kkheee3nnd0..T0rro;eekfferrneesss.hheTTxoopkkieernne),s;_in,

0

8.2 GakuNin RDM OAuth設定

リダイレクトURIの登録:

a}syi}i}rnffectttcci}t(ooo(oofujakkktnncr}rwceeeoss(oe;ntcnnnkttsntare(o...ehsucext{uarencsotr.cfponcex.uhunterikttcfperolrosereo)erixrude{kssenkserpelRfeThs;e{sseindernoTAnThsrtRfe,kot,oTAeTersek:kotsifehneaek5Amrse:nMcne=teehd:acn)sTrto=a=h&oerhu=c{&kfe.nacM=erfftcaoatnerl,ccutcosseoocnhukhsouuot.re=ehrsnu.frnde(etnele.aTdDr.txonrwoTaa.poteakot}crirTfieke)cer(irtne.efeDmesnn{srsaesr.sose_thea.w_sae>Tfcr(tht.=orce)o_;nkeefktotessr/eowonhsenk(k)A_s1;e)ecth0nn{co_0;/.ekt0eseo)1xsnk0pT,e+0ion0rkr)ee?e;sn?fA(rttteoos-kkheee3nnd0..T0rro;eekfferrneesss.hheTTxoopkkieernne),s;_in,

1

まとめ

本システムでは、以下の技術的課題を解決しました:

  1. OAuth 2.0認証の実装 - GakuNin RDMとの安全な連携
  2. トークン自動リフレッシュ - 長時間セッションの維持
  3. Named Graphによるデータ分離 - プロジェクト単位の管理
  4. 非公開RDFデータの管理 - APIトークンによるアクセス制御
  5. Dublin Core完全対応 - 標準メタデータスキーマの実装
  6. SKOS主題階層管理 - 構造化された主題分類
  7. SPARQL検索 - 柔軟なメタデータ検索

このシステムは、研究データ管理における実用的なソリューションとして、オープンサイエンスの推進に貢献します。

参考リンク

ソースコード

完全なソースコードは以下のリポジトリで公開しています:
https://github.com/nakamura196/next-dydra