概要

Dydraは優れたクラウドベースのRDFトリプルストアですが、JSON-LDシリアライゼーションにおいて、一部のケースで期待と異なる出力が得られることがあります。このブログでは、その挙動と、我々が実装した回避策について解説します。

確認された挙動

期待される出力

JSON-LD仕様では、URI参照は以下のようにオブジェクト形式で出力されることが一般的です:

{}"""}"}@@p,pitr"r"dyo@o@"pvivi:e:d:d"w"w"":a:a:hsst[A"G"t"thehppttntsrrtet:iprpbsas/:u:t:eEt/e/xne/d/atdsBsmiTeyeptop"ply"o:oe":ll.]i{ic,{aao..mee/ttihhteeerrmss/cc1aa"nn,..iioo//atdxd/r0exsasb/c0dx.1.2.3"4..."

Dydraで確認された出力

DydraのJSON-LDエンドポイントでは、一部のURI参照が単なる文字列として出力されるケースが確認されました:

{}""""@@ppitrrdyoo"pvv:e::"ww":aahsst[AGt"tepptnsrre:irba/:uteEtexnedatdBmiTypto"ly":e":.]"c,"hohtmtt/tpipsts:e:m/s1se"ep,poolliiaa..eetthheerrssccaann..iiootaxd/d0rxeasbsc/d0.x.1.2"34...",

注意 : この挙動は全てのプロパティで発生するわけではなく、@contextの定義やプロパティの種類によって異なる場合があります。

挙動の違いによる影響

形式JSON-LDパーサーの解釈
{ "@id": "..." }URI参照(他ノードへのリンク)
"..."リテラル文字列

この違いにより、以下の影響が生じる可能性があります:

  • グラフ構造のトラバーサルに影響
  • 一部のSPARQLクエリ結果に影響
  • JSON-LDフレーミング処理に影響

型付きリテラルについて

同様に、xsd:dateTime などの型付きリテラルでも型情報が省略されるケースがあります。

期待される出力 :

{}"}pr""o@@vvt:ayslptueae"r":t:e"d"xA2st0dT2:i5dm-ae0t"1e:-T1i{5mTe1"0:30:00Z",

確認された出力 :

{}"prov:startedAtTime":"2025-01-15T10:30:00Z"

回避策

アプローチ:TTL形式で取得してJSON-LDを構築

DydraはTurtle (TTL) 形式では正確にシリアライズするため、以下の戦略を採用しました:

[[[[[DnJy3SdOrNa-ATQL]cST]uDcPLaeAdJ]pRsStQO:LN-tE]LenDxdtp/otiunrtt]le

実装

if}mupncccf}cf}r}oTDcooooooe;rTytnnnrci}cci}li}}}}pnrcf}gt""tLdissSsofoofefrJsooru@@rottut(nsnnpteci}}}eoeoeSt(nri}}arcg{anbcs(uss(r(bloflblbdOcsfpnorpqjsot!btt!eoqjsneesjsjiNgot(n}enhnaPJtaueunsjpdbuUees(blblbeeeec-rnc(o)lo.{tpaSuracbssuepprijaRctljsjsjccaLasnopdi}r;sdpehrOrsdtjtubcrrecedItiieeeeeit{ttDptonr@efeeeux"sJNtesebjteedac.VfltcccfVVehdset[rt[st:eS-lrcqjesddittoaietit{taas@:[etdy"(eu{ph"rOLe=tuec.iiceVb:l(trVfVV(ll.gs:ip@ttrr(:gNDT=sactsccasajuqeaaaaquugrAu[cetyunenr}-opdtseaat.le{eurll(llueeearbRpayprdoJaLJna=I.tttesucaa.ulluuatprjertpenoidSpfDserodh(eeseet"=dlleiieed==(haeceeeo;ceOhrowsnfassI.t:.@.attx.pycodI"fa)N,onee=sudh(ti{o=n=ees==o{qr<trid]t;LmLPrwq(b=apuedbgrrdbueRIdceDda.uqsj=srnr""jqu{aa:{lj"aded<a==aI_"(rpMauues(ekm:@euallsie@dic,st==sdCntsaadabcuqpdnTicag"..t"tci.cote=o=]O3uerpsdjtburioy"dtde@ddr@etdoarprIb={N"rrs<).eIjaecwp."..)vaaivr."btdrid"j=T;t(esscdeddane.:toattnaat:je<en,he""El)(t{ut,c.it;.eb{laaglleeIsdgtco@oXe;trbItpce="qrjuttu.r`cdti,ottbibT:uijdnsraI=umeeyyevm_t)rcbpsjdj,rne)e.etd=}aTc"pp"aT:.!iauj:.e"estgc)wgde,dyt:ee:ly$v.ntne/mc:ctl,teiI".p;.up{apgekc/attre.{Mtcd[Noel&vleeqlu,sntwp"ssi)Mva(a)]abi&ai;uus]osw(t.n;aapst))mj=tlt=aehuw]w(&rlgpl(ue;ee=eue=d;(non.o&ie)<u)b.{dc=rer=.okf>ow)nn:se)jvNtaaobnf3ggt;;eao."l!l"bjos=.=tRrcldvL.=.Bjewupo>!}hDitueaiv=vlecnb{rr=)FnIe"ltaaact>jeg{=[=Ggd;)uel"lntV>e"d/"=r,)eruhuk.ac@i1n@=a!{aeteNvl=tic9uipu;}l,t,oausda9ld1hn;"pdle[)"t9l"k)":"eu)]:e/]?{n@/@"e;;{s0&;o{l/t)}s)2&owawy`u/bnnwp{b{2"j[gwe}j2@e]u.";e-ic>aw:crdt>g3td"s(e.lIf[)"oid-i0;:rtsn]ge}yl/r;n:i2att0laoe0.x{br1d-ja/anelXtsc.Ma#tlLttsaSyy;ncppgheeue."amv)gaae#l{su}te;ri}n;g"){

使用例

c}cco)oonmh}b;nnTsee,ossTtta"dttLhdAyroec:tjedrcuss:seqrop:putno"tellnP{"redsO:yeS,==T"="tat,ewuaxarwtita/tliteturTreoftsJelpsteooc"nnh,sL(ed`.($tt{euDxrYTttDT(lRL)eA;)_;ENDPOIJNSTO}N/-sLpDarql`,{

依存ライブラリ

この回避策には n3 ライブラリが必要です:

nnppmmiinnssttaalllln3-save-dev@types/n3

まとめ

項目内容
確認された挙動一部のURI参照が { "@id": "..." } ではなく文字列になる
発生条件全てのケースではなく、コンテキストやプロパティにより異なる
回避策TTL形式で取得し、n3でパースしてJSON-LD構築
追加依存n3

Dydraを使用する際、JSON-LDの出力形式が期待と異なる場合は、TTL形式で取得してクライアント側で変換する方法が有効です。

参考リンク


Last updated: 2025-12-29