@thomasfosterau/effect-rdf 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +2251 -2
- package/dist/Algebra-CGG4oae3.mjs +433 -0
- package/dist/Algebra-CGG4oae3.mjs.map +1 -0
- package/dist/Algebra-uGsIEOUA.d.mts +446 -0
- package/dist/Ast-CPRZmBvk.mjs +552 -0
- package/dist/Ast-CPRZmBvk.mjs.map +1 -0
- package/dist/Ast-vcw2W-lf.d.mts +827 -0
- package/dist/Bindings-Ck3m7JRC.mjs +249 -0
- package/dist/Bindings-Ck3m7JRC.mjs.map +1 -0
- package/dist/Bindings-DiKpBd7f.d.mts +153 -0
- package/dist/ClientErrors-CpXdFX5u.mjs +128 -0
- package/dist/ClientErrors-CpXdFX5u.mjs.map +1 -0
- package/dist/ClientErrors-D4IZHUM-.d.mts +101 -0
- package/dist/ClientFormats-CXomkXLV.mjs +73 -0
- package/dist/ClientFormats-CXomkXLV.mjs.map +1 -0
- package/dist/ClientFormats-Dm57ZPwR.d.mts +36 -0
- package/dist/Csv2Json-DynEcwCh.mjs +194 -0
- package/dist/Csv2Json-DynEcwCh.mjs.map +1 -0
- package/dist/Csv2Json-aXNVDoXQ.d.mts +40 -0
- package/dist/Csv2Rdf-8maXP6mt.d.mts +41 -0
- package/dist/Csv2Rdf-DuSEkaKE.mjs +161 -0
- package/dist/Csv2Rdf-DuSEkaKE.mjs.map +1 -0
- package/dist/Dataset-BlmlcI7J.mjs +782 -0
- package/dist/Dataset-BlmlcI7J.mjs.map +1 -0
- package/dist/Dataset-DS3ESOcO.d.mts +426 -0
- package/dist/Dataset.d.mts +2 -0
- package/dist/Dataset.mjs +1 -0
- package/dist/Datatype-CxMpamHC.d.mts +212 -0
- package/dist/Datatype-DQvkNkiH.mjs +1001 -0
- package/dist/Datatype-DQvkNkiH.mjs.map +1 -0
- package/dist/Dialect-8ChFj5EX.d.mts +113 -0
- package/dist/Dialect-CzVH38uo.mjs +165 -0
- package/dist/Dialect-CzVH38uo.mjs.map +1 -0
- package/dist/DocumentLoader-D3lZREnB.mjs +346 -0
- package/dist/DocumentLoader-D3lZREnB.mjs.map +1 -0
- package/dist/DocumentLoader-ZUCEVrW5.d.mts +178 -0
- package/dist/DublinCore-AnwqxRx6.mjs +137 -0
- package/dist/DublinCore-AnwqxRx6.mjs.map +1 -0
- package/dist/DublinCore-Dq-tVA5d.d.mts +119 -0
- package/dist/Engine-CYPB3g4h.d.mts +144 -0
- package/dist/Engine-DF8PN7g-.mjs +872 -0
- package/dist/Engine-DF8PN7g-.mjs.map +1 -0
- package/dist/Errors-CMdV1RhU.mjs +37 -0
- package/dist/Errors-CMdV1RhU.mjs.map +1 -0
- package/dist/Errors-u2bDjUeM.d.mts +30 -0
- package/dist/Evaluator-DEsU4d1o.d.mts +50 -0
- package/dist/Evaluator-DOY2-guC.mjs +281 -0
- package/dist/Evaluator-DOY2-guC.mjs.map +1 -0
- package/dist/Exif-CpqniYQd.d.mts +78 -0
- package/dist/Exif-DjkCfEB-.mjs +89 -0
- package/dist/Exif-DjkCfEB-.mjs.map +1 -0
- package/dist/Expression-BIMMvduQ.mjs +230 -0
- package/dist/Expression-BIMMvduQ.mjs.map +1 -0
- package/dist/Expression-W8A9cyX7.d.mts +89 -0
- package/dist/Extract-Bop85jES.mjs +220 -0
- package/dist/Extract-Bop85jES.mjs.map +1 -0
- package/dist/Extract-C_pCvuTC.d.mts +88 -0
- package/dist/Federation-BcNrozc1.d.mts +52 -0
- package/dist/Federation-CHScBkaK.mjs +130 -0
- package/dist/Federation-CHScBkaK.mjs.map +1 -0
- package/dist/Functions-AvjNcId_.mjs +1346 -0
- package/dist/Functions-AvjNcId_.mjs.map +1 -0
- package/dist/Functions-OQJZP-F6.d.mts +111 -0
- package/dist/Generator-C52mmq01.d.mts +50 -0
- package/dist/Generator-D3utCJC7.mjs +205 -0
- package/dist/Generator-D3utCJC7.mjs.map +1 -0
- package/dist/Grammar-CPlSxGH6.mjs +200 -0
- package/dist/Grammar-CPlSxGH6.mjs.map +1 -0
- package/dist/Grammar-CRhnRoCu.d.mts +148 -0
- package/dist/Grammar-D6jZdJQ3.d.mts +169 -0
- package/dist/Grammar-mQ8CgE1M.mjs +258 -0
- package/dist/Grammar-mQ8CgE1M.mjs.map +1 -0
- package/dist/GraphStore-DhUa4nFO.d.mts +45 -0
- package/dist/GraphStore-DvbqwKy1.mjs +212 -0
- package/dist/GraphStore-DvbqwKy1.mjs.map +1 -0
- package/dist/Iri-BB8Ks-BF.d.mts +84 -0
- package/dist/Iri-Cr92gsQV.mjs +232 -0
- package/dist/Iri-Cr92gsQV.mjs.map +1 -0
- package/dist/Iri.d.mts +2 -0
- package/dist/Iri.mjs +1 -0
- package/dist/Isomorphism-B6qTY-xy.d.mts +28 -0
- package/dist/Isomorphism-BmqxhKyJ.mjs +232 -0
- package/dist/Isomorphism-BmqxhKyJ.mjs.map +1 -0
- package/dist/Isomorphism-DInKnWIy.mjs +390 -0
- package/dist/Isomorphism-DInKnWIy.mjs.map +1 -0
- package/dist/Isomorphism-DvSfZXLR.d.mts +37 -0
- package/dist/Isomorphism.d.mts +2 -0
- package/dist/Isomorphism.mjs +1 -0
- package/dist/JsonLd-DOwS2FHg.mjs +2836 -0
- package/dist/JsonLd-DOwS2FHg.mjs.map +1 -0
- package/dist/JsonLd-DobFrQNa.d.mts +242 -0
- package/dist/JsonLdError-C9J-BxfG.mjs +106 -0
- package/dist/JsonLdError-C9J-BxfG.mjs.map +1 -0
- package/dist/JsonLdError-DSOfHkOy.d.mts +43 -0
- package/dist/LanguageTag-BCu8rcmX.d.mts +38 -0
- package/dist/LanguageTag-BcOpMGZ4.mjs +89 -0
- package/dist/LanguageTag-BcOpMGZ4.mjs.map +1 -0
- package/dist/LanguageTag.d.mts +2 -0
- package/dist/LanguageTag.mjs +1 -0
- package/dist/Lexical-Cg0JHrf6.mjs +243 -0
- package/dist/Lexical-Cg0JHrf6.mjs.map +1 -0
- package/dist/Lexical-D3zySYVS.d.mts +163 -0
- package/dist/Manifest-B6xf6mUc.mjs +148 -0
- package/dist/Manifest-B6xf6mUc.mjs.map +1 -0
- package/dist/Manifest-DQUMRBFr.d.mts +98 -0
- package/dist/Mapping-BgG74x3U.d.mts +63 -0
- package/dist/Mapping-Dc1ZGirk.mjs +259 -0
- package/dist/Mapping-Dc1ZGirk.mjs.map +1 -0
- package/dist/Mcp-1DwTTKOK.mjs +48 -0
- package/dist/Mcp-1DwTTKOK.mjs.map +1 -0
- package/dist/Mcp-d-pX9erx.d.mts +25 -0
- package/dist/Message-CK_DGQuu.mjs +95 -0
- package/dist/Message-CK_DGQuu.mjs.map +1 -0
- package/dist/Message-fIvTJSXM.d.mts +49 -0
- package/dist/Metadata-BbffwGDZ.mjs +445 -0
- package/dist/Metadata-BbffwGDZ.mjs.map +1 -0
- package/dist/Metadata-CEt3yc1-.d.mts +901 -0
- package/dist/Metadata-D4HsQNXr.mjs +1273 -0
- package/dist/Metadata-D4HsQNXr.mjs.map +1 -0
- package/dist/Metadata-nzS7QKRj.d.mts +350 -0
- package/dist/Model-DaMmxurZ.d.mts +293 -0
- package/dist/Model-DlPzRYhF.mjs +528 -0
- package/dist/Model-DlPzRYhF.mjs.map +1 -0
- package/dist/N3-BzyV-KIH.mjs +974 -0
- package/dist/N3-BzyV-KIH.mjs.map +1 -0
- package/dist/N3-DSLnonDn.d.mts +100 -0
- package/dist/NQuads-C1VBOJ3-.mjs +117 -0
- package/dist/NQuads-C1VBOJ3-.mjs.map +1 -0
- package/dist/NQuads-FjFZikFg.d.mts +76 -0
- package/dist/NTriples-D-kLSEAf.mjs +120 -0
- package/dist/NTriples-D-kLSEAf.mjs.map +1 -0
- package/dist/NTriples-D34OspfW.d.mts +76 -0
- package/dist/Namespace-ClTUO_ya.d.mts +42 -0
- package/dist/Namespace-DHFIsORd.mjs +75 -0
- package/dist/Namespace-DHFIsORd.mjs.map +1 -0
- package/dist/Namespace.d.mts +2 -0
- package/dist/Namespace.mjs +1 -0
- package/dist/Namespaces-Bz85vpjW.mjs +235 -0
- package/dist/Namespaces-Bz85vpjW.mjs.map +1 -0
- package/dist/Namespaces-C1jW6EDo.d.mts +178 -0
- package/dist/Optimizer-BWWQRQPY.mjs +168 -0
- package/dist/Optimizer-BWWQRQPY.mjs.map +1 -0
- package/dist/Optimizer-DUpUow6k.d.mts +26 -0
- package/dist/Options-BLBGL4HE.mjs +72 -0
- package/dist/Options-BLBGL4HE.mjs.map +1 -0
- package/dist/Options-BommQwP9.d.mts +127 -0
- package/dist/Packet-CA76wVX3.mjs +197 -0
- package/dist/Packet-CA76wVX3.mjs.map +1 -0
- package/dist/Packet-Cy5g6XuW.d.mts +130 -0
- package/dist/Parser-p1Gyr0QN.d.mts +85 -0
- package/dist/Parser-xARsOWXk.mjs +1317 -0
- package/dist/Parser-xARsOWXk.mjs.map +1 -0
- package/dist/Path-B20Yp8KE.mjs +284 -0
- package/dist/Path-B20Yp8KE.mjs.map +1 -0
- package/dist/Path-DRB8e-Zn.d.mts +181 -0
- package/dist/Pdf-B9RZn--8.d.mts +77 -0
- package/dist/Pdf-CKK6dkZn.mjs +89 -0
- package/dist/Pdf-CKK6dkZn.mjs.map +1 -0
- package/dist/PdfA-CUjSuntT.d.mts +109 -0
- package/dist/PdfA-CleOhuL6.mjs +124 -0
- package/dist/PdfA-CleOhuL6.mjs.map +1 -0
- package/dist/Photoshop-CiHo80qV.mjs +233 -0
- package/dist/Photoshop-CiHo80qV.mjs.map +1 -0
- package/dist/Photoshop-udKZ0I3N.d.mts +204 -0
- package/dist/PrefixMap-BHFPDLO-.mjs +103 -0
- package/dist/PrefixMap-BHFPDLO-.mjs.map +1 -0
- package/dist/PrefixMap-BMlXrWNd.d.mts +64 -0
- package/dist/PrefixMap.d.mts +2 -0
- package/dist/PrefixMap.mjs +1 -0
- package/dist/Processor-CMmecFsb.mjs +198 -0
- package/dist/Processor-CMmecFsb.mjs.map +1 -0
- package/dist/Processor-FJPvO0CB.d.mts +435 -0
- package/dist/Protocol-BA7OkNgp.mjs +202 -0
- package/dist/Protocol-BA7OkNgp.mjs.map +1 -0
- package/dist/Protocol-DlSoiIKB.d.mts +108 -0
- package/dist/ProtocolErrors-Ckfejnl6.d.mts +84 -0
- package/dist/ProtocolErrors-czDPVcX5.mjs +129 -0
- package/dist/ProtocolErrors-czDPVcX5.mjs.map +1 -0
- package/dist/Query-D9A6LOpP.mjs +364 -0
- package/dist/Query-D9A6LOpP.mjs.map +1 -0
- package/dist/Query-KqSkTYyG.d.mts +96 -0
- package/dist/QueryBuilder-BLK9Vfbz.mjs +674 -0
- package/dist/QueryBuilder-BLK9Vfbz.mjs.map +1 -0
- package/dist/QueryBuilder-DUqh4ECe.d.mts +529 -0
- package/dist/RdfJs-D6-49XB5.mjs +86 -0
- package/dist/RdfJs-D6-49XB5.mjs.map +1 -0
- package/dist/RdfJs-DXFqdWrd.d.mts +76 -0
- package/dist/RdfJs.d.mts +2 -0
- package/dist/RdfJs.mjs +1 -0
- package/dist/RdfJson-5aKPDlPS.d.mts +297 -0
- package/dist/RdfJson-BNocgW4f.mjs +548 -0
- package/dist/RdfJson-BNocgW4f.mjs.map +1 -0
- package/dist/RdfXml-DJ9G4gOq.mjs +1014 -0
- package/dist/RdfXml-DJ9G4gOq.mjs.map +1 -0
- package/dist/RdfXml-_N7yxWEp.d.mts +149 -0
- package/dist/Rdfs-BRVPsAjc.d.mts +84 -0
- package/dist/Rdfs-CyY2wVHI.mjs +167 -0
- package/dist/Rdfs-CyY2wVHI.mjs.map +1 -0
- package/dist/Rdfs.d.mts +2 -0
- package/dist/Rdfs.mjs +1 -0
- package/dist/Reasoner-BxYhx9s7.d.mts +94 -0
- package/dist/Reasoner-Cw90zrjv.mjs +798 -0
- package/dist/Reasoner-Cw90zrjv.mjs.map +1 -0
- package/dist/Reification-BmN4EfnM.d.mts +40 -0
- package/dist/Reification-dpqQvjDE.mjs +82 -0
- package/dist/Reification-dpqQvjDE.mjs.map +1 -0
- package/dist/Reification.d.mts +2 -0
- package/dist/Reification.mjs +1 -0
- package/dist/Report-XHs8htzK.mjs +121 -0
- package/dist/Report-XHs8htzK.mjs.map +1 -0
- package/dist/Report-hcXsc_19.d.mts +115 -0
- package/dist/Resource-B1cI8FyJ.d.mts +218 -0
- package/dist/Resource-sIEeNh15.mjs +374 -0
- package/dist/Resource-sIEeNh15.mjs.map +1 -0
- package/dist/Resource.d.mts +2 -0
- package/dist/Resource.mjs +1 -0
- package/dist/Results-BVNEC-Wt.d.mts +277 -0
- package/dist/Results-peJjGA2V.mjs +621 -0
- package/dist/Results-peJjGA2V.mjs.map +1 -0
- package/dist/ResultsStream-BhF0OcNn.mjs +639 -0
- package/dist/ResultsStream-BhF0OcNn.mjs.map +1 -0
- package/dist/ResultsStream-toYMXrOe.d.mts +100 -0
- package/dist/SemAct-CDchtk49.d.mts +96 -0
- package/dist/SemAct-CmyT4yI8.mjs +118 -0
- package/dist/SemAct-CmyT4yI8.mjs.map +1 -0
- package/dist/Serialization-DP9H5bYQ.mjs +514 -0
- package/dist/Serialization-DP9H5bYQ.mjs.map +1 -0
- package/dist/Serialization-Df8iVauT.d.mts +392 -0
- package/dist/Serialization.d.mts +2 -0
- package/dist/Serialization.mjs +1 -0
- package/dist/ServerFormats-CrRnjjf6.mjs +64 -0
- package/dist/ServerFormats-CrRnjjf6.mjs.map +1 -0
- package/dist/ServerFormats-DjC9NsO_.d.mts +36 -0
- package/dist/ServiceDescription-BERsvg-k.d.mts +54 -0
- package/dist/ServiceDescription-Dq5hxeGy.mjs +97 -0
- package/dist/ServiceDescription-Dq5hxeGy.mjs.map +1 -0
- package/dist/ShExC-Ctf-06CL.d.mts +67 -0
- package/dist/ShExC-DJbB19i3.mjs +1181 -0
- package/dist/ShExC-DJbB19i3.mjs.map +1 -0
- package/dist/ShExError-BeYFD9rv.d.mts +61 -0
- package/dist/ShExError-CVtq2NnM.mjs +64 -0
- package/dist/ShExError-CVtq2NnM.mjs.map +1 -0
- package/dist/ShExJ-C1u_wgyD.d.mts +531 -0
- package/dist/ShExJ-COiPd9Xw.mjs +532 -0
- package/dist/ShExJ-COiPd9Xw.mjs.map +1 -0
- package/dist/ShExR-ByR4mCh-.mjs +480 -0
- package/dist/ShExR-ByR4mCh-.mjs.map +1 -0
- package/dist/ShExR-CqONNNBz.d.mts +40 -0
- package/dist/ShapeMap-C422pxKl.d.mts +140 -0
- package/dist/ShapeMap-CsgKxB2G.mjs +181 -0
- package/dist/ShapeMap-CsgKxB2G.mjs.map +1 -0
- package/dist/Shapes-18GjfyBV.mjs +597 -0
- package/dist/Shapes-18GjfyBV.mjs.map +1 -0
- package/dist/Shapes-BQFDFc4Q.d.mts +306 -0
- package/dist/Sparql-BiYFMSpl.mjs +29 -0
- package/dist/Sparql-BiYFMSpl.mjs.map +1 -0
- package/dist/Sparql-DecpWTPh.d.mts +97 -0
- package/dist/SparqlClient-C_CjXbwj.mjs +333 -0
- package/dist/SparqlClient-C_CjXbwj.mjs.map +1 -0
- package/dist/SparqlClient-UPc88SHy.d.mts +290 -0
- package/dist/SparqlServer-CbUW-pVj.d.mts +71 -0
- package/dist/SparqlServer-Db7w7Cll.mjs +308 -0
- package/dist/SparqlServer-Db7w7Cll.mjs.map +1 -0
- package/dist/SqlStore-BBqFx-Wl.mjs +684 -0
- package/dist/SqlStore-BBqFx-Wl.mjs.map +1 -0
- package/dist/SqlStore-CCJo5I-e.d.mts +117 -0
- package/dist/Store-D0jmVfb3.d.mts +166 -0
- package/dist/Store-DH3Ow1GO.mjs +162 -0
- package/dist/Store-DH3Ow1GO.mjs.map +1 -0
- package/dist/Structure-BjMo4Bkc.mjs +334 -0
- package/dist/Structure-BjMo4Bkc.mjs.map +1 -0
- package/dist/Structure-n4CmDiab.d.mts +63 -0
- package/dist/Table-BGgm9nbM.mjs +538 -0
- package/dist/Table-BGgm9nbM.mjs.map +1 -0
- package/dist/Table-C3reiVrb.d.mts +261 -0
- package/dist/Term-B_4ezyXq.d.mts +619 -0
- package/dist/Term-CFLG1qu4.mjs +991 -0
- package/dist/Term-CFLG1qu4.mjs.map +1 -0
- package/dist/Term.d.mts +2 -0
- package/dist/Term.mjs +1 -0
- package/dist/TermCodec-CDZiEztW.mjs +397 -0
- package/dist/TermCodec-CDZiEztW.mjs.map +1 -0
- package/dist/TermCodec-_03bDXr0.d.mts +209 -0
- package/dist/TermCodec.d.mts +2 -0
- package/dist/TermCodec.mjs +1 -0
- package/dist/TermJson-BOPe0yve.d.mts +232 -0
- package/dist/TermJson-FAg3lvjl.mjs +142 -0
- package/dist/TermJson-FAg3lvjl.mjs.map +1 -0
- package/dist/TermJson.d.mts +2 -0
- package/dist/TermJson.mjs +1 -0
- package/dist/TermSchema-Bn9CoaYA.mjs +30 -0
- package/dist/TermSchema-Bn9CoaYA.mjs.map +1 -0
- package/dist/TermSchema-DBO6MroX.d.mts +6 -0
- package/dist/Testing-B-aPCpmu.mjs +63 -0
- package/dist/Testing-B-aPCpmu.mjs.map +1 -0
- package/dist/Testing-CF6s8P3O.d.mts +53 -0
- package/dist/Tiff-CR-2QeSI.d.mts +148 -0
- package/dist/Tiff-DlsOlZPM.mjs +169 -0
- package/dist/Tiff-DlsOlZPM.mjs.map +1 -0
- package/dist/Tools-7MdRKccr.d.mts +583 -0
- package/dist/Tools-ryxphZbI.mjs +329 -0
- package/dist/Tools-ryxphZbI.mjs.map +1 -0
- package/dist/Translate-B0YKKANS.d.mts +37 -0
- package/dist/Translate-gzWPq0Ia.mjs +308 -0
- package/dist/Translate-gzWPq0Ia.mjs.map +1 -0
- package/dist/Translation-DC9rLm2y.mjs +1535 -0
- package/dist/Translation-DC9rLm2y.mjs.map +1 -0
- package/dist/Translation-K4L9XBqX.d.mts +103 -0
- package/dist/TriG-BkqtqZ6Y.mjs +125 -0
- package/dist/TriG-BkqtqZ6Y.mjs.map +1 -0
- package/dist/TriG-xDjdDatp.d.mts +86 -0
- package/dist/Turtle-Bv1_bisW.d.mts +85 -0
- package/dist/Turtle-CZVUOtwl.mjs +133 -0
- package/dist/Turtle-CZVUOtwl.mjs.map +1 -0
- package/dist/ValidationReport-DBdJshW5.mjs +285 -0
- package/dist/ValidationReport-DBdJshW5.mjs.map +1 -0
- package/dist/ValidationReport-Dx3WxY0h.d.mts +192 -0
- package/dist/Validator-227ff9Rn.d.mts +179 -0
- package/dist/Validator-BzXMKDeJ.mjs +1162 -0
- package/dist/Validator-BzXMKDeJ.mjs.map +1 -0
- package/dist/Validator-Dl8cih5V.d.mts +207 -0
- package/dist/Validator-DmUfMbpL.mjs +568 -0
- package/dist/Validator-DmUfMbpL.mjs.map +1 -0
- package/dist/Vocab-DceKywpq.mjs +168 -0
- package/dist/Vocab-DceKywpq.mjs.map +1 -0
- package/dist/Vocab-Df-L-IwZ.d.mts +46 -0
- package/dist/Vocab-Do56UgBX.d.mts +81 -0
- package/dist/Vocab-TfpWG1Ne.mjs +118 -0
- package/dist/Vocab-TfpWG1Ne.mjs.map +1 -0
- package/dist/Vocab.d.mts +2 -0
- package/dist/Vocab.mjs +1 -0
- package/dist/Vocabulary-C6-GPOy4.d.mts +22 -0
- package/dist/Vocabulary-CnQl-_Z4.mjs +179 -0
- package/dist/Vocabulary-CnQl-_Z4.mjs.map +1 -0
- package/dist/Xml-B7iihYCS.mjs +976 -0
- package/dist/Xml-B7iihYCS.mjs.map +1 -0
- package/dist/Xml-CmfHS7SW.d.mts +267 -0
- package/dist/Xmp-D7CKA7MZ.d.mts +111 -0
- package/dist/Xmp-DCGN9pOD.mjs +307 -0
- package/dist/Xmp-DCGN9pOD.mjs.map +1 -0
- package/dist/XmpBasic-CP38jpR_.mjs +73 -0
- package/dist/XmpBasic-CP38jpR_.mjs.map +1 -0
- package/dist/XmpBasic-Cmbe53rQ.d.mts +64 -0
- package/dist/XmpMM-BfL_TgJF.mjs +73 -0
- package/dist/XmpMM-BfL_TgJF.mjs.map +1 -0
- package/dist/XmpMM-Dqm3IX8p.d.mts +63 -0
- package/dist/XmpRights-BKPtoI5L.mjs +73 -0
- package/dist/XmpRights-BKPtoI5L.mjs.map +1 -0
- package/dist/XmpRights-CaALZQz2.d.mts +63 -0
- package/dist/Xsd-Cdgx5zRB.mjs +405 -0
- package/dist/Xsd-Cdgx5zRB.mjs.map +1 -0
- package/dist/Xsd-D2elNhSm.d.mts +187 -0
- package/dist/Xsd.d.mts +2 -0
- package/dist/Xsd.mjs +1 -0
- package/dist/accessors-CEjaojuQ.mjs +28 -0
- package/dist/accessors-CEjaojuQ.mjs.map +1 -0
- package/dist/codec-Lb2T96rv.d.mts +20 -0
- package/dist/codec-QNo7IdJF.mjs +389 -0
- package/dist/codec-QNo7IdJF.mjs.map +1 -0
- package/dist/csvw/Csv2Json.d.mts +2 -0
- package/dist/csvw/Csv2Json.mjs +1 -0
- package/dist/csvw/Csv2Rdf.d.mts +2 -0
- package/dist/csvw/Csv2Rdf.mjs +1 -0
- package/dist/csvw/Datatype.d.mts +2 -0
- package/dist/csvw/Datatype.mjs +1 -0
- package/dist/csvw/Metadata.d.mts +2 -0
- package/dist/csvw/Metadata.mjs +1 -0
- package/dist/csvw/Processor.d.mts +2 -0
- package/dist/csvw/Processor.mjs +1 -0
- package/dist/csvw/Report.d.mts +2 -0
- package/dist/csvw/Report.mjs +1 -0
- package/dist/csvw/Table.d.mts +2 -0
- package/dist/csvw/Table.mjs +1 -0
- package/dist/csvw/index.d.mts +8 -0
- package/dist/csvw/index.mjs +8 -0
- package/dist/index-Cms2TYfC.d.mts +16 -0
- package/dist/index-Ct8xFmRs.d.mts +7 -0
- package/dist/index-D4QFwOjm.d.mts +28 -0
- package/dist/index.d.mts +18 -0
- package/dist/index.mjs +17 -0
- package/dist/jsonld/DocumentLoader.d.mts +2 -0
- package/dist/jsonld/DocumentLoader.mjs +1 -0
- package/dist/jsonld/JsonLd.d.mts +2 -0
- package/dist/jsonld/JsonLd.mjs +1 -0
- package/dist/jsonld/JsonLdError.d.mts +2 -0
- package/dist/jsonld/JsonLdError.mjs +1 -0
- package/dist/jsonld/index.d.mts +4 -0
- package/dist/jsonld/index.mjs +4 -0
- package/dist/lists-D-OpQ0Ir.mjs +77 -0
- package/dist/lists-D-OpQ0Ir.mjs.map +1 -0
- package/dist/loop-D5-gNx9K.mjs +21 -0
- package/dist/loop-D5-gNx9K.mjs.map +1 -0
- package/dist/loop-DZ2hXlr_.mjs +21 -0
- package/dist/loop-DZ2hXlr_.mjs.map +1 -0
- package/dist/n3/Isomorphism.d.mts +2 -0
- package/dist/n3/Isomorphism.mjs +1 -0
- package/dist/n3/Mapping.d.mts +2 -0
- package/dist/n3/Mapping.mjs +1 -0
- package/dist/n3/Model.d.mts +2 -0
- package/dist/n3/Model.mjs +1 -0
- package/dist/n3/N3.d.mts +2 -0
- package/dist/n3/N3.mjs +1 -0
- package/dist/n3/Reasoner.d.mts +2 -0
- package/dist/n3/Reasoner.mjs +2 -0
- package/dist/n3/Vocab.d.mts +2 -0
- package/dist/n3/Vocab.mjs +1 -0
- package/dist/n3/index.d.mts +7 -0
- package/dist/n3/index.mjs +7 -0
- package/dist/ntriples/Grammar.d.mts +2 -0
- package/dist/ntriples/Grammar.mjs +1 -0
- package/dist/ntriples/Lexical.d.mts +2 -0
- package/dist/ntriples/Lexical.mjs +1 -0
- package/dist/ntriples/NQuads.d.mts +2 -0
- package/dist/ntriples/NQuads.mjs +1 -0
- package/dist/ntriples/NTriples.d.mts +2 -0
- package/dist/ntriples/NTriples.mjs +1 -0
- package/dist/ntriples/index.d.mts +5 -0
- package/dist/ntriples/index.mjs +5 -0
- package/dist/rdfjson/RdfJson.d.mts +2 -0
- package/dist/rdfjson/RdfJson.mjs +1 -0
- package/dist/rdfjson/index.d.mts +2 -0
- package/dist/rdfjson/index.mjs +1 -0
- package/dist/rdfxml/RdfXml.d.mts +2 -0
- package/dist/rdfxml/RdfXml.mjs +1 -0
- package/dist/rdfxml/Xml.d.mts +2 -0
- package/dist/rdfxml/Xml.mjs +1 -0
- package/dist/rdfxml/index.d.mts +3 -0
- package/dist/rdfxml/index.mjs +3 -0
- package/dist/rolldown-runtime-D8jQpDG7.mjs +12 -0
- package/dist/serialize-96KBvKaf.mjs +1463 -0
- package/dist/serialize-96KBvKaf.mjs.map +1 -0
- package/dist/serialize-DsoXdM6n.d.mts +37 -0
- package/dist/shacl/Message.d.mts +2 -0
- package/dist/shacl/Message.mjs +1 -0
- package/dist/shacl/Path.d.mts +2 -0
- package/dist/shacl/Path.mjs +1 -0
- package/dist/shacl/Shapes.d.mts +2 -0
- package/dist/shacl/Shapes.mjs +1 -0
- package/dist/shacl/Sparql.d.mts +2 -0
- package/dist/shacl/Sparql.mjs +1 -0
- package/dist/shacl/ValidationReport.d.mts +2 -0
- package/dist/shacl/ValidationReport.mjs +1 -0
- package/dist/shacl/Validator.d.mts +2 -0
- package/dist/shacl/Validator.mjs +1 -0
- package/dist/shacl/Vocabulary.d.mts +2 -0
- package/dist/shacl/Vocabulary.mjs +1 -0
- package/dist/shacl/index.d.mts +9 -0
- package/dist/shacl/index.mjs +8 -0
- package/dist/shex/SemAct.d.mts +2 -0
- package/dist/shex/SemAct.mjs +1 -0
- package/dist/shex/ShExC.d.mts +2 -0
- package/dist/shex/ShExC.mjs +1 -0
- package/dist/shex/ShExError.d.mts +2 -0
- package/dist/shex/ShExError.mjs +1 -0
- package/dist/shex/ShExJ.d.mts +2 -0
- package/dist/shex/ShExJ.mjs +2 -0
- package/dist/shex/ShExR.d.mts +2 -0
- package/dist/shex/ShExR.mjs +1 -0
- package/dist/shex/ShapeMap.d.mts +2 -0
- package/dist/shex/ShapeMap.mjs +1 -0
- package/dist/shex/Structure.d.mts +2 -0
- package/dist/shex/Structure.mjs +2 -0
- package/dist/shex/Validator.d.mts +2 -0
- package/dist/shex/Validator.mjs +4 -0
- package/dist/shex/index.d.mts +9 -0
- package/dist/shex/index.mjs +9 -0
- package/dist/sparql/Algebra.d.mts +2 -0
- package/dist/sparql/Algebra.mjs +1 -0
- package/dist/sparql/Ast.d.mts +2 -0
- package/dist/sparql/Ast.mjs +1 -0
- package/dist/sparql/Bindings.d.mts +2 -0
- package/dist/sparql/Bindings.mjs +1 -0
- package/dist/sparql/ClientErrors.d.mts +2 -0
- package/dist/sparql/ClientErrors.mjs +1 -0
- package/dist/sparql/ClientFormats.d.mts +2 -0
- package/dist/sparql/ClientFormats.mjs +1 -0
- package/dist/sparql/Engine.d.mts +2 -0
- package/dist/sparql/Engine.mjs +1 -0
- package/dist/sparql/Errors.d.mts +2 -0
- package/dist/sparql/Errors.mjs +1 -0
- package/dist/sparql/Expression.d.mts +2 -0
- package/dist/sparql/Expression.mjs +1 -0
- package/dist/sparql/Federation.d.mts +2 -0
- package/dist/sparql/Federation.mjs +1 -0
- package/dist/sparql/Functions.d.mts +2 -0
- package/dist/sparql/Functions.mjs +1 -0
- package/dist/sparql/Generator.d.mts +2 -0
- package/dist/sparql/Generator.mjs +1 -0
- package/dist/sparql/GraphStore.d.mts +2 -0
- package/dist/sparql/GraphStore.mjs +1 -0
- package/dist/sparql/Optimizer.d.mts +2 -0
- package/dist/sparql/Optimizer.mjs +1 -0
- package/dist/sparql/Options.d.mts +2 -0
- package/dist/sparql/Options.mjs +1 -0
- package/dist/sparql/Parser.d.mts +2 -0
- package/dist/sparql/Parser.mjs +1 -0
- package/dist/sparql/Protocol.d.mts +2 -0
- package/dist/sparql/Protocol.mjs +1 -0
- package/dist/sparql/ProtocolErrors.d.mts +2 -0
- package/dist/sparql/ProtocolErrors.mjs +1 -0
- package/dist/sparql/QueryBuilder.d.mts +2 -0
- package/dist/sparql/QueryBuilder.mjs +1 -0
- package/dist/sparql/Results.d.mts +2 -0
- package/dist/sparql/Results.mjs +1 -0
- package/dist/sparql/ResultsStream.d.mts +2 -0
- package/dist/sparql/ResultsStream.mjs +1 -0
- package/dist/sparql/ServerFormats.d.mts +2 -0
- package/dist/sparql/ServerFormats.mjs +1 -0
- package/dist/sparql/ServiceDescription.d.mts +2 -0
- package/dist/sparql/ServiceDescription.mjs +1 -0
- package/dist/sparql/SparqlClient.d.mts +2 -0
- package/dist/sparql/SparqlClient.mjs +1 -0
- package/dist/sparql/SparqlServer.d.mts +2 -0
- package/dist/sparql/SparqlServer.mjs +1 -0
- package/dist/sparql/Store.d.mts +2 -0
- package/dist/sparql/Store.mjs +1 -0
- package/dist/sparql/TermSchema.d.mts +3 -0
- package/dist/sparql/TermSchema.mjs +2 -0
- package/dist/sparql/Testing.d.mts +2 -0
- package/dist/sparql/Testing.mjs +1 -0
- package/dist/sparql/Translate.d.mts +2 -0
- package/dist/sparql/Translate.mjs +1 -0
- package/dist/sparql/ai/Mcp.d.mts +2 -0
- package/dist/sparql/ai/Mcp.mjs +1 -0
- package/dist/sparql/ai/Tools.d.mts +2 -0
- package/dist/sparql/ai/Tools.mjs +1 -0
- package/dist/sparql/ai/index.d.mts +3 -0
- package/dist/sparql/ai/index.mjs +3 -0
- package/dist/sparql/index.d.mts +30 -0
- package/dist/sparql/index.mjs +29 -0
- package/dist/sparql/shacl/Evaluator.d.mts +2 -0
- package/dist/sparql/shacl/Evaluator.mjs +1 -0
- package/dist/sparql/shacl/Query.d.mts +2 -0
- package/dist/sparql/shacl/Query.mjs +1 -0
- package/dist/sparql/shacl/index.d.mts +3 -0
- package/dist/sparql/shacl/index.mjs +3 -0
- package/dist/sparql/sql/Dialect.d.mts +2 -0
- package/dist/sparql/sql/Dialect.mjs +1 -0
- package/dist/sparql/sql/SqlStore.d.mts +2 -0
- package/dist/sparql/sql/SqlStore.mjs +1 -0
- package/dist/sparql/sql/Translation.d.mts +2 -0
- package/dist/sparql/sql/Translation.mjs +1 -0
- package/dist/sparql/sql/index.d.mts +4 -0
- package/dist/sparql/sql/index.mjs +4 -0
- package/dist/stringMap-D5YIpYtR.mjs +38 -0
- package/dist/stringMap-D5YIpYtR.mjs.map +1 -0
- package/dist/tokens-C6BzeodQ.mjs +24 -0
- package/dist/tokens-C6BzeodQ.mjs.map +1 -0
- package/dist/turtle/Grammar.d.mts +3 -0
- package/dist/turtle/Grammar.mjs +3 -0
- package/dist/turtle/Manifest.d.mts +2 -0
- package/dist/turtle/Manifest.mjs +1 -0
- package/dist/turtle/TriG.d.mts +2 -0
- package/dist/turtle/TriG.mjs +1 -0
- package/dist/turtle/Turtle.d.mts +2 -0
- package/dist/turtle/Turtle.mjs +1 -0
- package/dist/turtle/index.d.mts +5 -0
- package/dist/turtle/index.mjs +5 -0
- package/dist/xmp/DublinCore.d.mts +2 -0
- package/dist/xmp/DublinCore.mjs +1 -0
- package/dist/xmp/Exif.d.mts +2 -0
- package/dist/xmp/Exif.mjs +1 -0
- package/dist/xmp/Extract.d.mts +2 -0
- package/dist/xmp/Extract.mjs +1 -0
- package/dist/xmp/Metadata.d.mts +2 -0
- package/dist/xmp/Metadata.mjs +1 -0
- package/dist/xmp/Namespaces.d.mts +2 -0
- package/dist/xmp/Namespaces.mjs +1 -0
- package/dist/xmp/Packet.d.mts +2 -0
- package/dist/xmp/Packet.mjs +1 -0
- package/dist/xmp/Pdf.d.mts +2 -0
- package/dist/xmp/Pdf.mjs +1 -0
- package/dist/xmp/PdfA.d.mts +2 -0
- package/dist/xmp/PdfA.mjs +1 -0
- package/dist/xmp/Photoshop.d.mts +2 -0
- package/dist/xmp/Photoshop.mjs +1 -0
- package/dist/xmp/Tiff.d.mts +2 -0
- package/dist/xmp/Tiff.mjs +1 -0
- package/dist/xmp/Xmp.d.mts +2 -0
- package/dist/xmp/Xmp.mjs +3 -0
- package/dist/xmp/XmpBasic.d.mts +2 -0
- package/dist/xmp/XmpBasic.mjs +1 -0
- package/dist/xmp/XmpMM.d.mts +2 -0
- package/dist/xmp/XmpMM.mjs +1 -0
- package/dist/xmp/XmpRights.d.mts +2 -0
- package/dist/xmp/XmpRights.mjs +1 -0
- package/dist/xmp/index.d.mts +15 -0
- package/dist/xmp/index.mjs +15 -0
- package/package.json +195 -3
- package/src/Dataset.ts +1085 -0
- package/src/Iri.ts +322 -0
- package/src/Isomorphism.ts +319 -0
- package/src/LanguageTag.ts +98 -0
- package/src/Namespace.ts +100 -0
- package/src/PrefixMap.ts +117 -0
- package/src/RdfJs.ts +146 -0
- package/src/Rdfs.ts +241 -0
- package/src/Reification.ts +103 -0
- package/src/Resource.ts +873 -0
- package/src/Serialization.ts +775 -0
- package/src/Term.ts +1300 -0
- package/src/TermCodec.ts +505 -0
- package/src/TermJson.ts +313 -0
- package/src/Vocab.ts +161 -0
- package/src/Xsd.ts +573 -0
- package/src/csvw/Csv2Json.ts +265 -0
- package/src/csvw/Csv2Rdf.ts +268 -0
- package/src/csvw/Datatype.ts +589 -0
- package/src/csvw/Metadata.ts +1523 -0
- package/src/csvw/Processor.ts +276 -0
- package/src/csvw/Report.ts +135 -0
- package/src/csvw/Table.ts +759 -0
- package/src/csvw/index.ts +22 -0
- package/src/csvw/internal/dateFormat.ts +202 -0
- package/src/csvw/internal/json.ts +104 -0
- package/src/csvw/internal/numberFormat.ts +369 -0
- package/src/csvw/internal/object.ts +23 -0
- package/src/csvw/internal/uriTemplate.ts +130 -0
- package/src/csvw/internal/url.ts +93 -0
- package/src/csvw/internal/vocab.ts +282 -0
- package/src/index.ts +40 -0
- package/src/internal/arbitrary.ts +148 -0
- package/src/internal/loop.ts +24 -0
- package/src/internal/pending.ts +20 -0
- package/src/internal/textDecoder.ts +183 -0
- package/src/jsonld/DocumentLoader.ts +512 -0
- package/src/jsonld/JsonLd.ts +847 -0
- package/src/jsonld/JsonLdError.ts +105 -0
- package/src/jsonld/index.ts +13 -0
- package/src/jsonld/internal/compact.ts +852 -0
- package/src/jsonld/internal/context.ts +781 -0
- package/src/jsonld/internal/expand.ts +614 -0
- package/src/jsonld/internal/flatten.ts +243 -0
- package/src/jsonld/internal/frame.ts +559 -0
- package/src/jsonld/internal/iri.ts +52 -0
- package/src/jsonld/internal/json.ts +19 -0
- package/src/jsonld/internal/linkHeader.ts +60 -0
- package/src/jsonld/internal/rdf.ts +481 -0
- package/src/jsonld/internal/util.ts +367 -0
- package/src/n3/Isomorphism.ts +476 -0
- package/src/n3/Mapping.ts +332 -0
- package/src/n3/Model.ts +696 -0
- package/src/n3/N3.ts +237 -0
- package/src/n3/Reasoner.ts +568 -0
- package/src/n3/Vocab.ts +111 -0
- package/src/n3/index.ts +21 -0
- package/src/n3/internal/builtins.ts +668 -0
- package/src/n3/internal/guards.ts +23 -0
- package/src/n3/internal/lists.ts +106 -0
- package/src/n3/internal/loop.ts +28 -0
- package/src/n3/internal/parser.ts +1032 -0
- package/src/n3/internal/writer.ts +344 -0
- package/src/ntriples/Grammar.ts +317 -0
- package/src/ntriples/Lexical.ts +321 -0
- package/src/ntriples/NQuads.ts +140 -0
- package/src/ntriples/NTriples.ts +143 -0
- package/src/ntriples/index.ts +14 -0
- package/src/ntriples/internal/codec.ts +229 -0
- package/src/ntriples/internal/lineParser.ts +326 -0
- package/src/ntriples/internal/loop.ts +14 -0
- package/src/rdfjson/RdfJson.ts +806 -0
- package/src/rdfjson/index.ts +9 -0
- package/src/rdfjson/internal/json.ts +19 -0
- package/src/rdfxml/RdfXml.ts +1408 -0
- package/src/rdfxml/Xml.ts +419 -0
- package/src/rdfxml/index.ts +11 -0
- package/src/rdfxml/internal/chars.ts +73 -0
- package/src/rdfxml/internal/loop.ts +24 -0
- package/src/rdfxml/internal/parser.ts +1265 -0
- package/src/shacl/Message.ts +102 -0
- package/src/shacl/Path.ts +483 -0
- package/src/shacl/Shapes.ts +913 -0
- package/src/shacl/Sparql.ts +128 -0
- package/src/shacl/ValidationReport.ts +438 -0
- package/src/shacl/Validator.ts +1156 -0
- package/src/shacl/Vocabulary.ts +180 -0
- package/src/shacl/index.ts +22 -0
- package/src/shacl/internal/compare.ts +128 -0
- package/src/shacl/internal/regex.ts +56 -0
- package/src/shex/SemAct.ts +197 -0
- package/src/shex/ShExC.ts +415 -0
- package/src/shex/ShExError.ts +71 -0
- package/src/shex/ShExJ.ts +893 -0
- package/src/shex/ShExR.ts +640 -0
- package/src/shex/ShapeMap.ts +385 -0
- package/src/shex/Structure.ts +467 -0
- package/src/shex/Validator.ts +395 -0
- package/src/shex/index.ts +24 -0
- package/src/shex/internal/engine.ts +682 -0
- package/src/shex/internal/iterate.ts +14 -0
- package/src/shex/internal/json.ts +12 -0
- package/src/shex/internal/lexer.ts +56 -0
- package/src/shex/internal/nodeConstraint.ts +368 -0
- package/src/shex/internal/shexcLexer.ts +387 -0
- package/src/shex/internal/shexcParser.ts +1312 -0
- package/src/shex/internal/tokens.ts +41 -0
- package/src/shex/internal/xpathRegex.ts +290 -0
- package/src/sparql/Algebra.ts +914 -0
- package/src/sparql/Ast.ts +1344 -0
- package/src/sparql/Bindings.ts +272 -0
- package/src/sparql/ClientErrors.ts +156 -0
- package/src/sparql/ClientFormats.ts +70 -0
- package/src/sparql/Engine.ts +699 -0
- package/src/sparql/Errors.ts +30 -0
- package/src/sparql/Expression.ts +360 -0
- package/src/sparql/Federation.ts +187 -0
- package/src/sparql/Functions.ts +689 -0
- package/src/sparql/Generator.ts +426 -0
- package/src/sparql/GraphStore.ts +341 -0
- package/src/sparql/Optimizer.ts +230 -0
- package/src/sparql/Options.ts +191 -0
- package/src/sparql/Parser.ts +173 -0
- package/src/sparql/Protocol.ts +342 -0
- package/src/sparql/ProtocolErrors.ts +113 -0
- package/src/sparql/QueryBuilder.ts +953 -0
- package/src/sparql/Results.ts +844 -0
- package/src/sparql/ResultsStream.ts +771 -0
- package/src/sparql/ServerFormats.ts +75 -0
- package/src/sparql/ServiceDescription.ts +130 -0
- package/src/sparql/SparqlClient.ts +947 -0
- package/src/sparql/SparqlServer.ts +528 -0
- package/src/sparql/Store.ts +311 -0
- package/src/sparql/TermSchema.ts +20 -0
- package/src/sparql/Testing.ts +114 -0
- package/src/sparql/Translate.ts +407 -0
- package/src/sparql/ai/Mcp.ts +43 -0
- package/src/sparql/ai/Tools.ts +481 -0
- package/src/sparql/ai/index.ts +11 -0
- package/src/sparql/index.ts +64 -0
- package/src/sparql/internal/evaluator.ts +947 -0
- package/src/sparql/internal/hash.ts +418 -0
- package/src/sparql/internal/json.ts +12 -0
- package/src/sparql/internal/lexer.ts +488 -0
- package/src/sparql/internal/loop.ts +24 -0
- package/src/sparql/internal/parser.ts +2215 -0
- package/src/sparql/internal/prefetch.ts +46 -0
- package/src/sparql/internal/stringMap.ts +39 -0
- package/src/sparql/internal/textResults.ts +226 -0
- package/src/sparql/internal/values.ts +550 -0
- package/src/sparql/shacl/Evaluator.ts +478 -0
- package/src/sparql/shacl/Query.ts +574 -0
- package/src/sparql/shacl/index.ts +12 -0
- package/src/sparql/sql/Dialect.ts +246 -0
- package/src/sparql/sql/SqlStore.ts +1080 -0
- package/src/sparql/sql/Translation.ts +1898 -0
- package/src/sparql/sql/index.ts +17 -0
- package/src/sparql/sql/internal/encoding.ts +313 -0
- package/src/turtle/Grammar.ts +286 -0
- package/src/turtle/Manifest.ts +215 -0
- package/src/turtle/TriG.ts +158 -0
- package/src/turtle/Turtle.ts +166 -0
- package/src/turtle/index.ts +14 -0
- package/src/turtle/internal/loop.ts +23 -0
- package/src/turtle/internal/parse.ts +112 -0
- package/src/turtle/internal/parser.ts +1303 -0
- package/src/turtle/internal/serialize.ts +79 -0
- package/src/turtle/internal/streamWriter.ts +128 -0
- package/src/turtle/internal/writer.ts +898 -0
- package/src/xmp/DublinCore.ts +147 -0
- package/src/xmp/Exif.ts +109 -0
- package/src/xmp/Extract.ts +351 -0
- package/src/xmp/Metadata.ts +703 -0
- package/src/xmp/Namespaces.ts +228 -0
- package/src/xmp/Packet.ts +297 -0
- package/src/xmp/Pdf.ts +99 -0
- package/src/xmp/PdfA.ts +280 -0
- package/src/xmp/Photoshop.ts +275 -0
- package/src/xmp/Tiff.ts +196 -0
- package/src/xmp/Xmp.ts +430 -0
- package/src/xmp/XmpBasic.ts +90 -0
- package/src/xmp/XmpMM.ts +82 -0
- package/src/xmp/XmpRights.ts +83 -0
- package/src/xmp/index.ts +36 -0
- package/src/xmp/internal/accessors.ts +72 -0
- package/src/xmp/internal/xml.ts +63 -0
package/src/Dataset.ts
ADDED
|
@@ -0,0 +1,1085 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Immutable, indexed RDF datasets.
|
|
3
|
+
*
|
|
4
|
+
* A `Dataset` is a persistent set of quads backed by Effect `HashMap`s, with
|
|
5
|
+
* per-position indexes so that pattern matching only scans the most
|
|
6
|
+
* selective index. Datasets implement `Equal` (set equality — use
|
|
7
|
+
* `Isomorphism.isomorphic` for blank-node-aware comparison), `Hash`,
|
|
8
|
+
* `Iterable<Quad>` and `Pipeable`.
|
|
9
|
+
*
|
|
10
|
+
* @since 0.1.0
|
|
11
|
+
*/
|
|
12
|
+
import * as Arr from 'effect/Array';
|
|
13
|
+
import { dual } from 'effect/Function';
|
|
14
|
+
import * as Equal from 'effect/Equal';
|
|
15
|
+
import * as Graph from 'effect/Graph';
|
|
16
|
+
import * as Hash from 'effect/Hash';
|
|
17
|
+
import * as HashMap from 'effect/HashMap';
|
|
18
|
+
import * as HashSet from 'effect/HashSet';
|
|
19
|
+
import { NodeInspectSymbol, type Inspectable } from 'effect/Inspectable';
|
|
20
|
+
import * as Iterable from 'effect/Iterable';
|
|
21
|
+
import * as MutableHashMap from 'effect/MutableHashMap';
|
|
22
|
+
import * as MutableHashSet from 'effect/MutableHashSet';
|
|
23
|
+
import * as Option from 'effect/Option';
|
|
24
|
+
import { pipeArguments, type Pipeable } from 'effect/Pipeable';
|
|
25
|
+
import { hasProperty } from 'effect/Predicate';
|
|
26
|
+
import * as Schema from 'effect/Schema';
|
|
27
|
+
import * as SchemaTransformation from 'effect/SchemaTransformation';
|
|
28
|
+
import { MAX_DATASET_SIZE } from './internal/arbitrary.ts';
|
|
29
|
+
import { loop } from './internal/loop.ts';
|
|
30
|
+
import * as Term from './Term.ts';
|
|
31
|
+
import { pendingQuads } from './internal/pending.ts';
|
|
32
|
+
import { rdf } from './Vocab.ts';
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @since 0.1.0
|
|
36
|
+
* @category symbols
|
|
37
|
+
*/
|
|
38
|
+
export const TypeId: unique symbol = Symbol.for('@thomasfosterau/effect-rdf/Dataset');
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @since 0.1.0
|
|
42
|
+
* @category symbols
|
|
43
|
+
*/
|
|
44
|
+
export type TypeId = typeof TypeId;
|
|
45
|
+
|
|
46
|
+
type Index = HashMap.HashMap<string, HashMap.HashMap<string, Term.Quad>>;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* @since 0.1.0
|
|
50
|
+
* @category models
|
|
51
|
+
*/
|
|
52
|
+
export interface Dataset extends Iterable<Term.Quad>, Equal.Equal, Pipeable, Inspectable {
|
|
53
|
+
readonly [TypeId]: TypeId;
|
|
54
|
+
readonly size: number;
|
|
55
|
+
/** @internal */
|
|
56
|
+
readonly quads: HashMap.HashMap<string, Term.Quad>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* A quad pattern. Omitted positions, `undefined` and variables match any
|
|
61
|
+
* term.
|
|
62
|
+
*
|
|
63
|
+
* @since 0.1.0
|
|
64
|
+
* @category models
|
|
65
|
+
*/
|
|
66
|
+
export interface Pattern {
|
|
67
|
+
readonly subject?: Term.Subject | Term.Variable | undefined;
|
|
68
|
+
readonly predicate?: Term.Predicate | Term.Variable | undefined;
|
|
69
|
+
readonly object?: Term.Object | Term.Variable | undefined;
|
|
70
|
+
readonly graph?: Term.Graph | Term.Variable | undefined;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** `isDataset` for a value already known to be an object. */
|
|
74
|
+
const hasDatasetTypeId = (u: Equal.Equal | Iterable<Term.Quad>): u is Dataset => TypeId in u;
|
|
75
|
+
|
|
76
|
+
type Spog = readonly [Index, Index, Index, Index];
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The indexes of the datasets that have been matched against, built on
|
|
80
|
+
* first use: parsing a document and serializing it never pays for them. A
|
|
81
|
+
* `WeakMap` rather than a field, so a dataset's own properties do not depend
|
|
82
|
+
* on whether it has been matched.
|
|
83
|
+
*/
|
|
84
|
+
const indexes = new WeakMap<Dataset, Spog>();
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* A parser's dataset is often only iterated or serialized once, or not at
|
|
88
|
+
* all, so `fromIterable` keeps its quads (`pendingQuads`) and the persistent
|
|
89
|
+
* map is built the first time it is needed (a lookup, a match or an update),
|
|
90
|
+
* with the same contents.
|
|
91
|
+
*/
|
|
92
|
+
const pending = pendingQuads;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* The distinct quads of the datasets made by `fromIterable`, in the order
|
|
96
|
+
* first given: what such a dataset iterates (before and after its quad set
|
|
97
|
+
* is built), so that iterating, counting or serializing it never builds the
|
|
98
|
+
* persistent map.
|
|
99
|
+
*/
|
|
100
|
+
const ordered = new WeakMap<Dataset, ReadonlyArray<Term.Quad>>();
|
|
101
|
+
|
|
102
|
+
/** Combines two hashes (a multiply-rotate step); `distinct` finishes them with `avalanche`. */
|
|
103
|
+
const mix = (a: number, b: number): number => Math.imul((a << 5) | (a >>> 27), 0x9e3779b1) ^ b;
|
|
104
|
+
|
|
105
|
+
/** The final mixing of a hash (MurmurHash3's), so that its low bits pick table slots well. */
|
|
106
|
+
const avalanche = (h: number): number => {
|
|
107
|
+
let x = Math.imul(h ^ (h >>> 16), 0x85ebca6b);
|
|
108
|
+
x = Math.imul(x ^ (x >>> 13), 0xc2b2ae35);
|
|
109
|
+
return x ^ (x >>> 16);
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* A hash of a subject or object (equal terms hash equally) that builds no
|
|
114
|
+
* key: a term's own hash, which IRIs, blank nodes and literals compute from
|
|
115
|
+
* their values and cache, and for a triple term, its parts'.
|
|
116
|
+
*/
|
|
117
|
+
const termHash = (t: Term.Term): number =>
|
|
118
|
+
t instanceof Term.Triple
|
|
119
|
+
? mix(mix(termHash(t.subject), t.predicate[Hash.symbol]()), termHash(t.object))
|
|
120
|
+
: // IRIs, blank nodes and literals hash their values and cache the result, so a node a
|
|
121
|
+
// parser shares between statements (a description's subject) is hashed once
|
|
122
|
+
t[Hash.symbol]();
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* A quad's hash for `distinct`: its predicate and graph, usually shared
|
|
126
|
+
* nodes, by their own cached hashes; its subject and object by `termHash`.
|
|
127
|
+
* Each position is hashed the same way for every quad, so equal quads hash
|
|
128
|
+
* equally.
|
|
129
|
+
*/
|
|
130
|
+
const quadHash = (q: Term.Quad): number =>
|
|
131
|
+
mix(
|
|
132
|
+
mix(mix(termHash(q.subject), q.predicate[Hash.symbol]()), termHash(q.object)),
|
|
133
|
+
q.graph[Hash.symbol](),
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The distinct quads of `quads` (equal keys), keeping the first of each in
|
|
138
|
+
* order: open addressing over their structural hashes, comparing keys only
|
|
139
|
+
* when two hashes are equal, so that no key is built for quads that differ.
|
|
140
|
+
*/
|
|
141
|
+
const distinct = (quads: ReadonlyArray<Term.Quad>): ReadonlyArray<Term.Quad> => {
|
|
142
|
+
const n = quads.length;
|
|
143
|
+
if (n < 2) return quads;
|
|
144
|
+
const mask = 2 ** Math.ceil(Math.log2(n * 2)) - 1;
|
|
145
|
+
const hashes = new Int32Array(mask + 1);
|
|
146
|
+
const slots = new Int32Array(mask + 1);
|
|
147
|
+
const out: Array<Term.Quad> = [];
|
|
148
|
+
quads.forEach((q, k) => {
|
|
149
|
+
const hash = avalanche(quadHash(q));
|
|
150
|
+
let i = hash & mask;
|
|
151
|
+
let duplicate = false;
|
|
152
|
+
// Linear probing: step to the next slot until an empty one or an equal quad
|
|
153
|
+
loop(() => {
|
|
154
|
+
const slot = slots[i] ?? 0;
|
|
155
|
+
if (slot === 0) return false;
|
|
156
|
+
if (hashes[i] === hash && (quads[slot - 1] ?? q).key === q.key) {
|
|
157
|
+
duplicate = true;
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
i = (i + 1) & mask;
|
|
161
|
+
return true;
|
|
162
|
+
});
|
|
163
|
+
if (duplicate) return;
|
|
164
|
+
hashes[i] = hash;
|
|
165
|
+
slots[i] = k + 1;
|
|
166
|
+
out.push(q);
|
|
167
|
+
});
|
|
168
|
+
return out.length === n ? quads : out;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
/** The distinct quads, in order, of a dataset made by `fromIterable` (none for any other). */
|
|
172
|
+
const orderedOf = (self: Dataset): Option.Option<ReadonlyArray<Term.Quad>> => {
|
|
173
|
+
const known = ordered.get(self);
|
|
174
|
+
if (known !== undefined) return Option.some(known);
|
|
175
|
+
const given = pending.get(self);
|
|
176
|
+
if (given === undefined) return Option.none();
|
|
177
|
+
const quads = distinct(given);
|
|
178
|
+
ordered.set(self, quads);
|
|
179
|
+
return Option.some(quads);
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
/** Builds a pending dataset's quad set, making it like any other dataset. */
|
|
183
|
+
const materialize = (self: Dataset): HashMap.HashMap<string, Term.Quad> => {
|
|
184
|
+
const quads = buildQuads(Option.getOrElse(orderedOf(self), () => []));
|
|
185
|
+
pending.delete(self);
|
|
186
|
+
Object.defineProperty(self, 'quads', { value: quads, enumerable: true });
|
|
187
|
+
return quads;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const Proto: Omit<Dataset, 'size' | 'quads'> & Pick<Dataset, 'size' | 'quads'> = {
|
|
191
|
+
[TypeId]: TypeId,
|
|
192
|
+
// Only a pending dataset reaches these: any other has its own `quads` and `size`
|
|
193
|
+
get quads(): HashMap.HashMap<string, Term.Quad> {
|
|
194
|
+
// SAFETY: the getter is only ever called on a dataset made from this prototype.
|
|
195
|
+
return materialize(this);
|
|
196
|
+
},
|
|
197
|
+
get size(): number {
|
|
198
|
+
// SAFETY: as for `quads`.
|
|
199
|
+
const size = Option.getOrElse(orderedOf(this), () => []).length;
|
|
200
|
+
Object.defineProperty(this, 'size', { value: size, enumerable: true });
|
|
201
|
+
return size;
|
|
202
|
+
},
|
|
203
|
+
[Symbol.iterator](this: Dataset): Iterator<Term.Quad> {
|
|
204
|
+
// A dataset made by `fromIterable` iterates its quads in the order first given
|
|
205
|
+
return Option.getOrElse(orderedOf(this), () => HashMap.values(this.quads))[Symbol.iterator]();
|
|
206
|
+
},
|
|
207
|
+
[Equal.symbol](this: Dataset, that: Equal.Equal): boolean {
|
|
208
|
+
if (!hasDatasetTypeId(that) || that.size !== this.size) return false;
|
|
209
|
+
const theirs = that.quads;
|
|
210
|
+
return HashMap.every(this.quads, (_quad, key) => HashMap.has(theirs, key));
|
|
211
|
+
},
|
|
212
|
+
[Hash.symbol](this: Dataset): number {
|
|
213
|
+
return Hash.optimize(Iterable.reduce(this, 0, (h, q) => (h + Hash.hash(q)) | 0));
|
|
214
|
+
},
|
|
215
|
+
pipe() {
|
|
216
|
+
return pipeArguments(this, arguments);
|
|
217
|
+
},
|
|
218
|
+
toString(this: Dataset) {
|
|
219
|
+
return toNQuads(this);
|
|
220
|
+
},
|
|
221
|
+
toJSON(this: Dataset) {
|
|
222
|
+
return { _id: 'Dataset', size: this.size, quads: Array.from(this, (q) => q.toString()) };
|
|
223
|
+
},
|
|
224
|
+
[NodeInspectSymbol](this: Dataset) {
|
|
225
|
+
return this.toJSON();
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
const makeDataset = (quads: HashMap.HashMap<string, Term.Quad>): Dataset => {
|
|
230
|
+
// Own data properties, which shadow the prototype's getters for pending datasets
|
|
231
|
+
return Object.create(Proto, {
|
|
232
|
+
quads: { value: quads, enumerable: true },
|
|
233
|
+
size: { value: HashMap.size(quads), enumerable: true },
|
|
234
|
+
});
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
const emptyIndex: Index = HashMap.empty();
|
|
238
|
+
|
|
239
|
+
const emptySpog: Spog = [emptyIndex, emptyIndex, emptyIndex, emptyIndex];
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* @since 0.1.0
|
|
243
|
+
* @category guards
|
|
244
|
+
*/
|
|
245
|
+
export const isDataset = (u: unknown): u is Dataset => hasProperty(u, TypeId);
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @since 0.1.0
|
|
249
|
+
* @category constructors
|
|
250
|
+
*/
|
|
251
|
+
export const empty: Dataset = makeDataset(HashMap.empty());
|
|
252
|
+
|
|
253
|
+
// -----------------------------------------------------------------------------
|
|
254
|
+
// Mutation (internal builder)
|
|
255
|
+
// -----------------------------------------------------------------------------
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* A transient builder used by `mutate` to apply many updates efficiently.
|
|
259
|
+
*
|
|
260
|
+
* @since 0.1.0
|
|
261
|
+
* @category models
|
|
262
|
+
*/
|
|
263
|
+
export interface Builder {
|
|
264
|
+
readonly add: (quad: Term.Quad) => Builder;
|
|
265
|
+
readonly addAll: (quads: Iterable<Term.Quad>) => Builder;
|
|
266
|
+
readonly remove: (quad: Term.Quad) => Builder;
|
|
267
|
+
readonly has: (quad: Term.Quad) => boolean;
|
|
268
|
+
readonly size: () => number;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/** The inner maps of one index made mutable during a batch, by term key. */
|
|
272
|
+
type Transients = MutableHashMap.MutableHashMap<string, HashMap.HashMap<string, Term.Quad>>;
|
|
273
|
+
|
|
274
|
+
const transients = (): Transients => MutableHashMap.empty();
|
|
275
|
+
|
|
276
|
+
const positions = (q: Term.Quad): readonly [string, string, string, string] => [
|
|
277
|
+
q.subject.key,
|
|
278
|
+
q.predicate.key,
|
|
279
|
+
q.object.key,
|
|
280
|
+
q.graph.key,
|
|
281
|
+
];
|
|
282
|
+
|
|
283
|
+
/** Updates to a dataset's four indexes, applied in place until `finish`. */
|
|
284
|
+
interface IndexBatch {
|
|
285
|
+
readonly add: (quad: Term.Quad, key: string) => void;
|
|
286
|
+
readonly remove: (quad: Term.Quad, key: string) => void;
|
|
287
|
+
readonly finish: () => Spog;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const indexBatch = (spog: Spog): IndexBatch => {
|
|
291
|
+
const idx: [Index, Index, Index, Index] = [
|
|
292
|
+
HashMap.beginMutation(spog[0]),
|
|
293
|
+
HashMap.beginMutation(spog[1]),
|
|
294
|
+
HashMap.beginMutation(spog[2]),
|
|
295
|
+
HashMap.beginMutation(spog[3]),
|
|
296
|
+
];
|
|
297
|
+
// The inner maps this batch has made mutable, per position, so that adding
|
|
298
|
+
// a quad updates its four inner maps in place instead of copying a path of
|
|
299
|
+
// each (they are frozen again by `finish`).
|
|
300
|
+
const open: [Transients, Transients, Transients, Transients] = [
|
|
301
|
+
transients(),
|
|
302
|
+
transients(),
|
|
303
|
+
transients(),
|
|
304
|
+
transients(),
|
|
305
|
+
];
|
|
306
|
+
const inner = (i: 0 | 1 | 2 | 3, termKey: string): HashMap.HashMap<string, Term.Quad> => {
|
|
307
|
+
const opened = open[i];
|
|
308
|
+
const known = MutableHashMap.get(opened, termKey);
|
|
309
|
+
if (Option.isSome(known)) return known.value;
|
|
310
|
+
const map = HashMap.beginMutation(
|
|
311
|
+
Option.getOrElse(HashMap.get(idx[i], termKey), () => HashMap.empty<string, Term.Quad>()),
|
|
312
|
+
);
|
|
313
|
+
// Stored in `idx[i]` by `close`, once the batch is done: setting it here,
|
|
314
|
+
// still equal to the map it copies, is a no-op on effect 4.0.x, whose
|
|
315
|
+
// `HashMap.set` keeps an existing value `Equal.equals` to the new one
|
|
316
|
+
MutableHashMap.set(opened, termKey, map);
|
|
317
|
+
return map;
|
|
318
|
+
};
|
|
319
|
+
// A mutable map is updated in place, so the results of `set` and `remove` are the map itself
|
|
320
|
+
const addAt = (i: 0 | 1 | 2 | 3, termKey: string, key: string, quad: Term.Quad): void => {
|
|
321
|
+
HashMap.set(inner(i, termKey), key, quad);
|
|
322
|
+
};
|
|
323
|
+
const removeAt = (i: 0 | 1 | 2 | 3, termKey: string, key: string): void => {
|
|
324
|
+
if (MutableHashMap.has(open[i], termKey) || HashMap.has(idx[i], termKey)) {
|
|
325
|
+
HashMap.remove(inner(i, termKey), key);
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
const close = (i: 0 | 1 | 2 | 3): void => {
|
|
329
|
+
MutableHashMap.forEach(open[i], (map, termKey) => {
|
|
330
|
+
HashMap.endMutation(map);
|
|
331
|
+
idx[i] =
|
|
332
|
+
HashMap.size(map) === 0
|
|
333
|
+
? HashMap.remove(idx[i], termKey)
|
|
334
|
+
: HashMap.set(idx[i], termKey, map);
|
|
335
|
+
});
|
|
336
|
+
};
|
|
337
|
+
return {
|
|
338
|
+
add(quad, key) {
|
|
339
|
+
addAt(0, quad.subject.key, key, quad);
|
|
340
|
+
addAt(1, quad.predicate.key, key, quad);
|
|
341
|
+
addAt(2, quad.object.key, key, quad);
|
|
342
|
+
addAt(3, quad.graph.key, key, quad);
|
|
343
|
+
},
|
|
344
|
+
remove(quad, key) {
|
|
345
|
+
removeAt(0, quad.subject.key, key);
|
|
346
|
+
removeAt(1, quad.predicate.key, key);
|
|
347
|
+
removeAt(2, quad.object.key, key);
|
|
348
|
+
removeAt(3, quad.graph.key, key);
|
|
349
|
+
},
|
|
350
|
+
finish() {
|
|
351
|
+
close(0);
|
|
352
|
+
close(1);
|
|
353
|
+
close(2);
|
|
354
|
+
close(3);
|
|
355
|
+
return [
|
|
356
|
+
HashMap.endMutation(idx[0]),
|
|
357
|
+
HashMap.endMutation(idx[1]),
|
|
358
|
+
HashMap.endMutation(idx[2]),
|
|
359
|
+
HashMap.endMutation(idx[3]),
|
|
360
|
+
];
|
|
361
|
+
},
|
|
362
|
+
};
|
|
363
|
+
};
|
|
364
|
+
|
|
365
|
+
/** The indexes of a dataset, built the first time they are needed. */
|
|
366
|
+
const indexesOf = (self: Dataset): Spog => {
|
|
367
|
+
const built = indexes.get(self);
|
|
368
|
+
if (built !== undefined) return built;
|
|
369
|
+
const batch = indexBatch(emptySpog);
|
|
370
|
+
HashMap.forEach(self.quads, (quad, key) => batch.add(quad, key));
|
|
371
|
+
const spog = batch.finish();
|
|
372
|
+
indexes.set(self, spog);
|
|
373
|
+
return spog;
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Applies a batch of updates to a dataset using a transient builder.
|
|
378
|
+
*
|
|
379
|
+
* @since 0.1.0
|
|
380
|
+
* @category combinators
|
|
381
|
+
*/
|
|
382
|
+
export const mutate: {
|
|
383
|
+
(f: (builder: Builder) => void): (self: Dataset) => Dataset;
|
|
384
|
+
(self: Dataset, f: (builder: Builder) => void): Dataset;
|
|
385
|
+
} = dual(2, (self: Dataset, f: (builder: Builder) => void): Dataset => {
|
|
386
|
+
let quads = HashMap.beginMutation(self.quads);
|
|
387
|
+
// Indexes already built are kept up to date; otherwise the result builds its own when matched
|
|
388
|
+
const spog = indexes.get(self);
|
|
389
|
+
const batch = spog === undefined ? undefined : indexBatch(spog);
|
|
390
|
+
const builder: Builder = {
|
|
391
|
+
add(quad) {
|
|
392
|
+
const key = quad.key;
|
|
393
|
+
// One lookup: `set` on the mutable map grows it only if the quad is new. A duplicate
|
|
394
|
+
// replaces the stored quad with an equal one.
|
|
395
|
+
const before = HashMap.size(quads);
|
|
396
|
+
quads = HashMap.set(quads, key, quad);
|
|
397
|
+
if (HashMap.size(quads) !== before) batch?.add(quad, key);
|
|
398
|
+
return builder;
|
|
399
|
+
},
|
|
400
|
+
addAll(iterable) {
|
|
401
|
+
Iterable.forEach(iterable, (q) => {
|
|
402
|
+
builder.add(q);
|
|
403
|
+
});
|
|
404
|
+
return builder;
|
|
405
|
+
},
|
|
406
|
+
remove(quad) {
|
|
407
|
+
const key = quad.key;
|
|
408
|
+
if (!HashMap.has(quads, key)) return builder;
|
|
409
|
+
quads = HashMap.remove(quads, key);
|
|
410
|
+
batch?.remove(quad, key);
|
|
411
|
+
return builder;
|
|
412
|
+
},
|
|
413
|
+
has: (quad) => HashMap.has(quads, quad.key),
|
|
414
|
+
size: () => HashMap.size(quads),
|
|
415
|
+
};
|
|
416
|
+
f(builder);
|
|
417
|
+
const result = makeDataset(HashMap.endMutation(quads));
|
|
418
|
+
if (batch !== undefined) indexes.set(result, batch.finish());
|
|
419
|
+
return result;
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
// -----------------------------------------------------------------------------
|
|
423
|
+
// Constructors
|
|
424
|
+
// -----------------------------------------------------------------------------
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* @since 0.1.0
|
|
428
|
+
* @category constructors
|
|
429
|
+
*/
|
|
430
|
+
export const fromIterable = (quads: Iterable<Term.Quad>): Dataset => {
|
|
431
|
+
if (hasDatasetTypeId(quads)) return quads;
|
|
432
|
+
const self: Dataset = Object.create(Proto);
|
|
433
|
+
pending.set(self, Array.from(quads));
|
|
434
|
+
return self;
|
|
435
|
+
};
|
|
436
|
+
|
|
437
|
+
/** The quad set of `quads`, deduplicated by key (the first of equal quads is kept). */
|
|
438
|
+
const buildQuads = (quads: ReadonlyArray<Term.Quad>): HashMap.HashMap<string, Term.Quad> =>
|
|
439
|
+
mutate(empty, (b) => b.addAll(quads)).quads;
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* @since 0.1.0
|
|
443
|
+
* @category constructors
|
|
444
|
+
*/
|
|
445
|
+
export const make = (...quads: ReadonlyArray<Term.Quad>): Dataset => fromIterable(quads);
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Creates a dataset from triples, placing them in the given graph (the
|
|
449
|
+
* default graph when omitted).
|
|
450
|
+
*
|
|
451
|
+
* @since 0.1.0
|
|
452
|
+
* @category constructors
|
|
453
|
+
*/
|
|
454
|
+
export const fromTriples = (
|
|
455
|
+
triples: Iterable<Term.Triple>,
|
|
456
|
+
graph: Term.Graph = Term.defaultGraph,
|
|
457
|
+
): Dataset =>
|
|
458
|
+
mutate(empty, (b) => {
|
|
459
|
+
Iterable.forEach(triples, (t) => {
|
|
460
|
+
b.add(new Term.Quad(t.subject, t.predicate, t.object, graph));
|
|
461
|
+
});
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
// -----------------------------------------------------------------------------
|
|
465
|
+
// Updates
|
|
466
|
+
// -----------------------------------------------------------------------------
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* @since 0.1.0
|
|
470
|
+
* @category combinators
|
|
471
|
+
*/
|
|
472
|
+
export const add: {
|
|
473
|
+
(quad: Term.Quad): (self: Dataset) => Dataset;
|
|
474
|
+
(self: Dataset, quad: Term.Quad): Dataset;
|
|
475
|
+
} = dual(2, (self: Dataset, quad: Term.Quad): Dataset =>
|
|
476
|
+
HashMap.has(self.quads, quad.key) ? self : mutate(self, (b) => b.add(quad)),
|
|
477
|
+
);
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* @since 0.1.0
|
|
481
|
+
* @category combinators
|
|
482
|
+
*/
|
|
483
|
+
export const addAll: {
|
|
484
|
+
(quads: Iterable<Term.Quad>): (self: Dataset) => Dataset;
|
|
485
|
+
(self: Dataset, quads: Iterable<Term.Quad>): Dataset;
|
|
486
|
+
} = dual(2, (self: Dataset, quads: Iterable<Term.Quad>): Dataset =>
|
|
487
|
+
mutate(self, (b) => b.addAll(quads)),
|
|
488
|
+
);
|
|
489
|
+
|
|
490
|
+
/**
|
|
491
|
+
* @since 0.1.0
|
|
492
|
+
* @category combinators
|
|
493
|
+
*/
|
|
494
|
+
export const remove: {
|
|
495
|
+
(quad: Term.Quad): (self: Dataset) => Dataset;
|
|
496
|
+
(self: Dataset, quad: Term.Quad): Dataset;
|
|
497
|
+
} = dual(2, (self: Dataset, quad: Term.Quad): Dataset =>
|
|
498
|
+
HashMap.has(self.quads, quad.key) ? mutate(self, (b) => b.remove(quad)) : self,
|
|
499
|
+
);
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Removes every quad matching a pattern.
|
|
503
|
+
*
|
|
504
|
+
* @since 0.1.0
|
|
505
|
+
* @category combinators
|
|
506
|
+
*/
|
|
507
|
+
export const removeMatches: {
|
|
508
|
+
(pattern: Pattern): (self: Dataset) => Dataset;
|
|
509
|
+
(self: Dataset, pattern: Pattern): Dataset;
|
|
510
|
+
} = dual(2, (self: Dataset, pattern: Pattern): Dataset => {
|
|
511
|
+
const matches = match(self, pattern);
|
|
512
|
+
return Arr.isReadonlyArrayEmpty(matches) ? self : mutate(self, (b) => matches.forEach(b.remove));
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
// -----------------------------------------------------------------------------
|
|
516
|
+
// Queries
|
|
517
|
+
// -----------------------------------------------------------------------------
|
|
518
|
+
|
|
519
|
+
/**
|
|
520
|
+
* @since 0.1.0
|
|
521
|
+
* @category predicates
|
|
522
|
+
*/
|
|
523
|
+
export const has: {
|
|
524
|
+
(quad: Term.Quad): (self: Dataset) => boolean;
|
|
525
|
+
(self: Dataset, quad: Term.Quad): boolean;
|
|
526
|
+
} = dual(2, (self: Dataset, quad: Term.Quad): boolean => HashMap.has(self.quads, quad.key));
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* @since 0.1.0
|
|
530
|
+
* @category predicates
|
|
531
|
+
*/
|
|
532
|
+
export const isEmpty = (self: Dataset): boolean => self.size === 0;
|
|
533
|
+
|
|
534
|
+
/** A position of a quad: subject, predicate, object or graph (the index of its `Spog` index). */
|
|
535
|
+
type Position = 0 | 1 | 2 | 3;
|
|
536
|
+
|
|
537
|
+
/** A bound position of a pattern, with the key its term must have. */
|
|
538
|
+
interface Check {
|
|
539
|
+
readonly position: Position;
|
|
540
|
+
readonly key: string;
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
/** The bound positions of a pattern (omitted positions and variables match any term). */
|
|
544
|
+
const checksOf = (pattern: Pattern): ReadonlyArray<Check> => {
|
|
545
|
+
const checks: Array<Check> = [];
|
|
546
|
+
const at = (position: Position, t: Pattern[keyof Pattern]): void => {
|
|
547
|
+
if (t !== undefined && !Term.isVariable(t)) checks.push({ position, key: t.key });
|
|
548
|
+
};
|
|
549
|
+
at(0, pattern.subject);
|
|
550
|
+
at(1, pattern.predicate);
|
|
551
|
+
at(2, pattern.object);
|
|
552
|
+
at(3, pattern.graph);
|
|
553
|
+
return checks;
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Returns all quads matching a pattern, using the most selective index.
|
|
558
|
+
*
|
|
559
|
+
* @since 0.1.0
|
|
560
|
+
* @category queries
|
|
561
|
+
*/
|
|
562
|
+
export const match: {
|
|
563
|
+
(pattern: Pattern): (self: Dataset) => ReadonlyArray<Term.Quad>;
|
|
564
|
+
(self: Dataset, pattern: Pattern): ReadonlyArray<Term.Quad>;
|
|
565
|
+
} = dual(2, (self: Dataset, pattern: Pattern): ReadonlyArray<Term.Quad> => {
|
|
566
|
+
const checks = checksOf(pattern);
|
|
567
|
+
let candidates: Option.Option<HashMap.HashMap<string, Term.Quad>> = Option.none();
|
|
568
|
+
let candidateSize = Infinity;
|
|
569
|
+
// The smallest inner map of the bound positions; none of them holding the term matches nothing
|
|
570
|
+
const missing = checks.some(({ position, key }) => {
|
|
571
|
+
const inner = HashMap.get(indexesOf(self)[position], key);
|
|
572
|
+
if (Option.isNone(inner)) return true;
|
|
573
|
+
const size = HashMap.size(inner.value);
|
|
574
|
+
if (size < candidateSize) {
|
|
575
|
+
candidates = inner;
|
|
576
|
+
candidateSize = size;
|
|
577
|
+
}
|
|
578
|
+
return false;
|
|
579
|
+
});
|
|
580
|
+
if (missing) return [];
|
|
581
|
+
const source = Option.getOrElse(candidates, () => self.quads);
|
|
582
|
+
const out: Array<Term.Quad> = [];
|
|
583
|
+
if (checks.length > 1) {
|
|
584
|
+
HashMap.forEach(source, (q) => {
|
|
585
|
+
const ks = positions(q);
|
|
586
|
+
if (checks.every(({ position, key }) => ks[position] === key)) out.push(q);
|
|
587
|
+
});
|
|
588
|
+
} else {
|
|
589
|
+
HashMap.forEach(source, (q) => {
|
|
590
|
+
out.push(q);
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
return out;
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* Counts the quads matching a pattern.
|
|
598
|
+
*
|
|
599
|
+
* @since 0.1.0
|
|
600
|
+
* @category queries
|
|
601
|
+
*/
|
|
602
|
+
export const count: {
|
|
603
|
+
(pattern: Pattern): (self: Dataset) => number;
|
|
604
|
+
(self: Dataset, pattern: Pattern): number;
|
|
605
|
+
} = dual(2, (self: Dataset, pattern: Pattern): number => match(self, pattern).length);
|
|
606
|
+
|
|
607
|
+
/**
|
|
608
|
+
* Returns a dataset containing only the quads matching a pattern.
|
|
609
|
+
*
|
|
610
|
+
* @since 0.1.0
|
|
611
|
+
* @category queries
|
|
612
|
+
*/
|
|
613
|
+
export const filterMatches: {
|
|
614
|
+
(pattern: Pattern): (self: Dataset) => Dataset;
|
|
615
|
+
(self: Dataset, pattern: Pattern): Dataset;
|
|
616
|
+
} = dual(2, (self: Dataset, pattern: Pattern): Dataset => fromIterable(match(self, pattern)));
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
* The objects of all quads with the given subject and predicate (in any
|
|
620
|
+
* graph unless one is specified).
|
|
621
|
+
*
|
|
622
|
+
* @since 0.1.0
|
|
623
|
+
* @category queries
|
|
624
|
+
*/
|
|
625
|
+
export const objectsOf = (
|
|
626
|
+
self: Dataset,
|
|
627
|
+
subject: Term.Subject,
|
|
628
|
+
predicate: Term.Predicate,
|
|
629
|
+
graph?: Term.Graph,
|
|
630
|
+
): ReadonlyArray<Term.Object> =>
|
|
631
|
+
uniqueTerms(match(self, { subject, predicate, graph }).map((q) => q.object));
|
|
632
|
+
|
|
633
|
+
/**
|
|
634
|
+
* The first object of a subject/predicate pair, if any.
|
|
635
|
+
*
|
|
636
|
+
* @since 0.1.0
|
|
637
|
+
* @category queries
|
|
638
|
+
*/
|
|
639
|
+
export const objectOf = (
|
|
640
|
+
self: Dataset,
|
|
641
|
+
subject: Term.Subject,
|
|
642
|
+
predicate: Term.Predicate,
|
|
643
|
+
graph?: Term.Graph,
|
|
644
|
+
): Option.Option<Term.Object> =>
|
|
645
|
+
Option.fromNullishOr(match(self, { subject, predicate, graph })[0]?.object);
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* The subjects of all quads with the given predicate and object.
|
|
649
|
+
*
|
|
650
|
+
* @since 0.1.0
|
|
651
|
+
* @category queries
|
|
652
|
+
*/
|
|
653
|
+
export const subjectsOf = (
|
|
654
|
+
self: Dataset,
|
|
655
|
+
predicate: Term.Predicate,
|
|
656
|
+
object: Term.Object,
|
|
657
|
+
graph?: Term.Graph,
|
|
658
|
+
): ReadonlyArray<Term.Subject> =>
|
|
659
|
+
uniqueTerms(match(self, { predicate, object, graph }).map((q) => q.subject));
|
|
660
|
+
|
|
661
|
+
const uniqueTerms = <T extends Term.Term>(terms: ReadonlyArray<T>): ReadonlyArray<T> => {
|
|
662
|
+
if (terms.length < 2) return terms;
|
|
663
|
+
return uniqueByKey(terms);
|
|
664
|
+
};
|
|
665
|
+
|
|
666
|
+
/** The first of each group of values with equal keys, in order. */
|
|
667
|
+
const uniqueByKey = <T extends { readonly key: string }>(values: Iterable<T>): Array<T> => {
|
|
668
|
+
const seen = MutableHashMap.empty<string, T>();
|
|
669
|
+
Iterable.forEach(values, (t) => {
|
|
670
|
+
if (!MutableHashMap.has(seen, t.key)) MutableHashMap.set(seen, t.key, t);
|
|
671
|
+
});
|
|
672
|
+
return Arr.fromIterable(MutableHashMap.values(seen));
|
|
673
|
+
};
|
|
674
|
+
|
|
675
|
+
const termsAt = <T extends Term.Term>(
|
|
676
|
+
self: Dataset,
|
|
677
|
+
position: Position,
|
|
678
|
+
pick: (q: Term.Quad) => T,
|
|
679
|
+
): ReadonlyArray<T> =>
|
|
680
|
+
// An inner map is removed from the index when its last quad goes, so each holds one
|
|
681
|
+
Arr.flatMap(Arr.fromIterable(HashMap.values(indexesOf(self)[position])), (inner) =>
|
|
682
|
+
Arr.fromOption(Option.map(Iterable.head(HashMap.values(inner)), pick)),
|
|
683
|
+
);
|
|
684
|
+
|
|
685
|
+
/**
|
|
686
|
+
* All distinct subjects.
|
|
687
|
+
*
|
|
688
|
+
* @since 0.1.0
|
|
689
|
+
* @category queries
|
|
690
|
+
*/
|
|
691
|
+
export const subjects = (self: Dataset): ReadonlyArray<Term.Subject> =>
|
|
692
|
+
termsAt(self, 0, (q) => q.subject);
|
|
693
|
+
|
|
694
|
+
/**
|
|
695
|
+
* All distinct predicates.
|
|
696
|
+
*
|
|
697
|
+
* @since 0.1.0
|
|
698
|
+
* @category queries
|
|
699
|
+
*/
|
|
700
|
+
export const predicates = (self: Dataset): ReadonlyArray<Term.Predicate> =>
|
|
701
|
+
termsAt(self, 1, (q) => q.predicate);
|
|
702
|
+
|
|
703
|
+
/**
|
|
704
|
+
* All distinct objects.
|
|
705
|
+
*
|
|
706
|
+
* @since 0.1.0
|
|
707
|
+
* @category queries
|
|
708
|
+
*/
|
|
709
|
+
export const objects = (self: Dataset): ReadonlyArray<Term.Object> =>
|
|
710
|
+
termsAt(self, 2, (q) => q.object);
|
|
711
|
+
|
|
712
|
+
/**
|
|
713
|
+
* All distinct graph names (including the default graph if it is non-empty).
|
|
714
|
+
*
|
|
715
|
+
* @since 0.1.0
|
|
716
|
+
* @category queries
|
|
717
|
+
*/
|
|
718
|
+
export const graphs = (self: Dataset): ReadonlyArray<Term.Graph> =>
|
|
719
|
+
termsAt(self, 3, (q) => q.graph);
|
|
720
|
+
|
|
721
|
+
/**
|
|
722
|
+
* The quads of one graph.
|
|
723
|
+
*
|
|
724
|
+
* @since 0.1.0
|
|
725
|
+
* @category queries
|
|
726
|
+
*/
|
|
727
|
+
export const graph: {
|
|
728
|
+
(graph: Term.Graph): (self: Dataset) => Dataset;
|
|
729
|
+
(self: Dataset, graph: Term.Graph): Dataset;
|
|
730
|
+
} = dual(2, (self: Dataset, graphName: Term.Graph): Dataset =>
|
|
731
|
+
filterMatches(self, { graph: graphName }),
|
|
732
|
+
);
|
|
733
|
+
|
|
734
|
+
/**
|
|
735
|
+
* The triples of the dataset, ignoring graph names (duplicates across graphs
|
|
736
|
+
* are merged).
|
|
737
|
+
*
|
|
738
|
+
* @since 0.1.0
|
|
739
|
+
* @category conversions
|
|
740
|
+
*/
|
|
741
|
+
export const triples = (self: Dataset): ReadonlyArray<Term.Triple> => {
|
|
742
|
+
return uniqueByKey(Iterable.map(self, (q) => q.triple));
|
|
743
|
+
};
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* Moves every quad into a single graph.
|
|
747
|
+
*
|
|
748
|
+
* @since 0.1.0
|
|
749
|
+
* @category combinators
|
|
750
|
+
*/
|
|
751
|
+
export const withGraph: {
|
|
752
|
+
(graph: Term.Graph): (self: Dataset) => Dataset;
|
|
753
|
+
(self: Dataset, graph: Term.Graph): Dataset;
|
|
754
|
+
} = dual(2, (self: Dataset, graphName: Term.Graph): Dataset =>
|
|
755
|
+
fromIterable(Array.from(self, (q) => new Term.Quad(q.subject, q.predicate, q.object, graphName))),
|
|
756
|
+
);
|
|
757
|
+
|
|
758
|
+
/**
|
|
759
|
+
* Reads an RDF collection (`rdf:first`/`rdf:rest` list) starting at `head`.
|
|
760
|
+
* Returns `None` if the list is malformed (missing or multiple `first`/`rest`
|
|
761
|
+
* values, or cyclic).
|
|
762
|
+
*
|
|
763
|
+
* @since 0.1.0
|
|
764
|
+
* @category queries
|
|
765
|
+
*/
|
|
766
|
+
export const list = (
|
|
767
|
+
self: Dataset,
|
|
768
|
+
head: Term.Object,
|
|
769
|
+
graphName?: Term.Graph,
|
|
770
|
+
): Option.Option<ReadonlyArray<Term.Object>> => {
|
|
771
|
+
const items: Array<Term.Object> = [];
|
|
772
|
+
const seen = MutableHashSet.empty<string>();
|
|
773
|
+
let node: Term.Object = head;
|
|
774
|
+
let wellFormed = true;
|
|
775
|
+
// Follow `rdf:rest` to `rdf:nil`, stopping at a literal, a cycle or a node without one value each
|
|
776
|
+
loop(() => {
|
|
777
|
+
const current = node;
|
|
778
|
+
if (Term.isNamedNode(current) && current.value === rdf.nil.value) return false;
|
|
779
|
+
if (Term.isLiteral(current) || MutableHashSet.has(seen, current.key)) {
|
|
780
|
+
wellFormed = false;
|
|
781
|
+
return false;
|
|
782
|
+
}
|
|
783
|
+
MutableHashSet.add(seen, current.key);
|
|
784
|
+
const first = objectsOf(self, current, rdf.first, graphName);
|
|
785
|
+
const rest = objectsOf(self, current, rdf.rest, graphName);
|
|
786
|
+
if (
|
|
787
|
+
!Arr.isReadonlyArrayNonEmpty(first) ||
|
|
788
|
+
!Arr.isReadonlyArrayNonEmpty(rest) ||
|
|
789
|
+
first.length !== 1 ||
|
|
790
|
+
rest.length !== 1
|
|
791
|
+
) {
|
|
792
|
+
wellFormed = false;
|
|
793
|
+
return false;
|
|
794
|
+
}
|
|
795
|
+
items.push(first[0]);
|
|
796
|
+
node = rest[0];
|
|
797
|
+
return true;
|
|
798
|
+
});
|
|
799
|
+
return wellFormed ? Option.some(items) : Option.none();
|
|
800
|
+
};
|
|
801
|
+
|
|
802
|
+
// -----------------------------------------------------------------------------
|
|
803
|
+
// Set operations and folds
|
|
804
|
+
// -----------------------------------------------------------------------------
|
|
805
|
+
|
|
806
|
+
/**
|
|
807
|
+
* @since 0.1.0
|
|
808
|
+
* @category combinators
|
|
809
|
+
*/
|
|
810
|
+
export const union: {
|
|
811
|
+
(that: Dataset): (self: Dataset) => Dataset;
|
|
812
|
+
(self: Dataset, that: Dataset): Dataset;
|
|
813
|
+
} = dual(2, (self: Dataset, that: Dataset): Dataset =>
|
|
814
|
+
self.size >= that.size ? addAll(self, that) : addAll(that, self),
|
|
815
|
+
);
|
|
816
|
+
|
|
817
|
+
/**
|
|
818
|
+
* @since 0.1.0
|
|
819
|
+
* @category combinators
|
|
820
|
+
*/
|
|
821
|
+
export const intersection: {
|
|
822
|
+
(that: Dataset): (self: Dataset) => Dataset;
|
|
823
|
+
(self: Dataset, that: Dataset): Dataset;
|
|
824
|
+
} = dual(2, (self: Dataset, that: Dataset): Dataset => filter(self, (q) => has(that, q)));
|
|
825
|
+
|
|
826
|
+
/**
|
|
827
|
+
* @since 0.1.0
|
|
828
|
+
* @category combinators
|
|
829
|
+
*/
|
|
830
|
+
export const difference: {
|
|
831
|
+
(that: Dataset): (self: Dataset) => Dataset;
|
|
832
|
+
(self: Dataset, that: Dataset): Dataset;
|
|
833
|
+
} = dual(2, (self: Dataset, that: Dataset): Dataset =>
|
|
834
|
+
mutate(self, (b) => {
|
|
835
|
+
Iterable.forEach(that, (q) => {
|
|
836
|
+
b.remove(q);
|
|
837
|
+
});
|
|
838
|
+
}),
|
|
839
|
+
);
|
|
840
|
+
|
|
841
|
+
/**
|
|
842
|
+
* @since 0.1.0
|
|
843
|
+
* @category combinators
|
|
844
|
+
*/
|
|
845
|
+
export const filter: {
|
|
846
|
+
(predicate: (quad: Term.Quad) => boolean): (self: Dataset) => Dataset;
|
|
847
|
+
(self: Dataset, predicate: (quad: Term.Quad) => boolean): Dataset;
|
|
848
|
+
} = dual(2, (self: Dataset, predicate: (quad: Term.Quad) => boolean): Dataset =>
|
|
849
|
+
mutate(empty, (b) => {
|
|
850
|
+
Iterable.forEach(self, (q) => {
|
|
851
|
+
if (predicate(q)) b.add(q);
|
|
852
|
+
});
|
|
853
|
+
}),
|
|
854
|
+
);
|
|
855
|
+
|
|
856
|
+
/**
|
|
857
|
+
* @since 0.1.0
|
|
858
|
+
* @category combinators
|
|
859
|
+
*/
|
|
860
|
+
export const map: {
|
|
861
|
+
(f: (quad: Term.Quad) => Term.Quad): (self: Dataset) => Dataset;
|
|
862
|
+
(self: Dataset, f: (quad: Term.Quad) => Term.Quad): Dataset;
|
|
863
|
+
} = dual(2, (self: Dataset, f: (quad: Term.Quad) => Term.Quad): Dataset =>
|
|
864
|
+
mutate(empty, (b) => {
|
|
865
|
+
Iterable.forEach(self, (q) => {
|
|
866
|
+
b.add(f(q));
|
|
867
|
+
});
|
|
868
|
+
}),
|
|
869
|
+
);
|
|
870
|
+
|
|
871
|
+
/**
|
|
872
|
+
* @since 0.1.0
|
|
873
|
+
* @category combinators
|
|
874
|
+
*/
|
|
875
|
+
export const flatMap: {
|
|
876
|
+
(f: (quad: Term.Quad) => Iterable<Term.Quad>): (self: Dataset) => Dataset;
|
|
877
|
+
(self: Dataset, f: (quad: Term.Quad) => Iterable<Term.Quad>): Dataset;
|
|
878
|
+
} = dual(2, (self: Dataset, f: (quad: Term.Quad) => Iterable<Term.Quad>): Dataset =>
|
|
879
|
+
mutate(empty, (b) => {
|
|
880
|
+
Iterable.forEach(self, (q) => {
|
|
881
|
+
b.addAll(f(q));
|
|
882
|
+
});
|
|
883
|
+
}),
|
|
884
|
+
);
|
|
885
|
+
|
|
886
|
+
/**
|
|
887
|
+
* @since 0.1.0
|
|
888
|
+
* @category folding
|
|
889
|
+
*/
|
|
890
|
+
export const reduce: {
|
|
891
|
+
<B>(initial: B, f: (acc: B, quad: Term.Quad) => B): (self: Dataset) => B;
|
|
892
|
+
<B>(self: Dataset, initial: B, f: (acc: B, quad: Term.Quad) => B): B;
|
|
893
|
+
} = dual(3, <B>(self: Dataset, initial: B, f: (acc: B, quad: Term.Quad) => B): B =>
|
|
894
|
+
Iterable.reduce(self, initial, (acc, q) => f(acc, q)),
|
|
895
|
+
);
|
|
896
|
+
|
|
897
|
+
/**
|
|
898
|
+
* @since 0.1.0
|
|
899
|
+
* @category predicates
|
|
900
|
+
*/
|
|
901
|
+
export const some: {
|
|
902
|
+
(predicate: (quad: Term.Quad) => boolean): (self: Dataset) => boolean;
|
|
903
|
+
(self: Dataset, predicate: (quad: Term.Quad) => boolean): boolean;
|
|
904
|
+
} = dual(2, (self: Dataset, predicate: (quad: Term.Quad) => boolean): boolean =>
|
|
905
|
+
Iterable.some(self, (q) => predicate(q)),
|
|
906
|
+
);
|
|
907
|
+
|
|
908
|
+
/**
|
|
909
|
+
* @since 0.1.0
|
|
910
|
+
* @category predicates
|
|
911
|
+
*/
|
|
912
|
+
export const every: {
|
|
913
|
+
(predicate: (quad: Term.Quad) => boolean): (self: Dataset) => boolean;
|
|
914
|
+
(self: Dataset, predicate: (quad: Term.Quad) => boolean): boolean;
|
|
915
|
+
} = dual(
|
|
916
|
+
2,
|
|
917
|
+
(self: Dataset, predicate: (quad: Term.Quad) => boolean): boolean =>
|
|
918
|
+
!Iterable.some(self, (q) => !predicate(q)),
|
|
919
|
+
);
|
|
920
|
+
|
|
921
|
+
/**
|
|
922
|
+
* Whether every quad of `self` is in `that`.
|
|
923
|
+
*
|
|
924
|
+
* @since 0.1.0
|
|
925
|
+
* @category predicates
|
|
926
|
+
*/
|
|
927
|
+
export const isSubset: {
|
|
928
|
+
(that: Dataset): (self: Dataset) => boolean;
|
|
929
|
+
(self: Dataset, that: Dataset): boolean;
|
|
930
|
+
} = dual(2, (self: Dataset, that: Dataset): boolean => every(self, (q) => has(that, q)));
|
|
931
|
+
|
|
932
|
+
// -----------------------------------------------------------------------------
|
|
933
|
+
// Conversions
|
|
934
|
+
// -----------------------------------------------------------------------------
|
|
935
|
+
|
|
936
|
+
/**
|
|
937
|
+
* @since 0.1.0
|
|
938
|
+
* @category conversions
|
|
939
|
+
*/
|
|
940
|
+
export const toArray = (self: Dataset): ReadonlyArray<Term.Quad> => Array.from(self);
|
|
941
|
+
|
|
942
|
+
/**
|
|
943
|
+
* The quads in a deterministic order (graph, subject, predicate, object).
|
|
944
|
+
*
|
|
945
|
+
* @since 0.1.0
|
|
946
|
+
* @category conversions
|
|
947
|
+
*/
|
|
948
|
+
export const toSortedArray = (self: Dataset): ReadonlyArray<Term.Quad> =>
|
|
949
|
+
Arr.sort(self, Term.compareQuads);
|
|
950
|
+
|
|
951
|
+
/**
|
|
952
|
+
* Serialises to canonical, sorted N-Quads (one statement per line).
|
|
953
|
+
*
|
|
954
|
+
* @since 0.1.0
|
|
955
|
+
* @category conversions
|
|
956
|
+
*/
|
|
957
|
+
export const toNQuads = (self: Dataset): string =>
|
|
958
|
+
toSortedArray(self)
|
|
959
|
+
.map((q) => `${q.toString()}\n`)
|
|
960
|
+
.join('');
|
|
961
|
+
|
|
962
|
+
/**
|
|
963
|
+
* Schema of a dataset; its JSON codec is an array of `TermJson.Quad`s in
|
|
964
|
+
* `toSortedArray` order, so encoding is deterministic.
|
|
965
|
+
*
|
|
966
|
+
* @since 0.1.0
|
|
967
|
+
* @category schemas
|
|
968
|
+
*/
|
|
969
|
+
export const DatasetSchema: Schema.declare<Dataset> = Schema.declare(isDataset, {
|
|
970
|
+
identifier: 'Dataset',
|
|
971
|
+
// An array of JSON quads in `toSortedArray` order, so encoding is deterministic.
|
|
972
|
+
toCodecJson: () =>
|
|
973
|
+
Schema.link<Dataset>()(
|
|
974
|
+
Schema.Array(Term.QuadSchema),
|
|
975
|
+
SchemaTransformation.transform({ decode: fromIterable, encode: toSortedArray }),
|
|
976
|
+
),
|
|
977
|
+
// Up to a dozen generated quads, whose terms are drawn from small pools so they share
|
|
978
|
+
// subjects, objects and graphs.
|
|
979
|
+
toCodecArbitrary: () =>
|
|
980
|
+
Schema.link<Dataset>()(
|
|
981
|
+
Schema.Array(Term.QuadSchema).check(Schema.isMaxLength(MAX_DATASET_SIZE)),
|
|
982
|
+
SchemaTransformation.transform({ decode: fromIterable, encode: toSortedArray }),
|
|
983
|
+
),
|
|
984
|
+
});
|
|
985
|
+
|
|
986
|
+
/**
|
|
987
|
+
* The type `DatasetSchema` decodes to.
|
|
988
|
+
*
|
|
989
|
+
* @since 0.1.0
|
|
990
|
+
* @category schemas
|
|
991
|
+
*/
|
|
992
|
+
export type DatasetSchema = typeof DatasetSchema.Type;
|
|
993
|
+
|
|
994
|
+
// -----------------------------------------------------------------------------
|
|
995
|
+
// Graph algorithms
|
|
996
|
+
// -----------------------------------------------------------------------------
|
|
997
|
+
|
|
998
|
+
/**
|
|
999
|
+
* Options for `toGraph`.
|
|
1000
|
+
*
|
|
1001
|
+
* @since 0.1.0
|
|
1002
|
+
* @category graphs
|
|
1003
|
+
*/
|
|
1004
|
+
export interface ToGraphOptions {
|
|
1005
|
+
/** Only these predicates become edges (e.g. `[rdfs.subClassOf]`); all of them when omitted. */
|
|
1006
|
+
readonly predicates?: ReadonlyArray<Term.NamedNode> | undefined;
|
|
1007
|
+
/** Only quads in this graph; every graph when omitted. */
|
|
1008
|
+
readonly graph?: Term.Graph | undefined;
|
|
1009
|
+
/** Whether literal objects become nodes (default `false`: their quads are left out). */
|
|
1010
|
+
readonly literals?: boolean | undefined;
|
|
1011
|
+
}
|
|
1012
|
+
|
|
1013
|
+
/**
|
|
1014
|
+
* A dataset as an `effect/Graph` directed graph, with the lookup from terms
|
|
1015
|
+
* to node indices that graph algorithms start from.
|
|
1016
|
+
*
|
|
1017
|
+
* @since 0.1.0
|
|
1018
|
+
* @category graphs
|
|
1019
|
+
*/
|
|
1020
|
+
export interface TermGraph {
|
|
1021
|
+
/** Nodes are the subjects and objects; each quad is an edge labelled with its predicate. */
|
|
1022
|
+
readonly graph: Graph.DirectedGraph<Term.Subject | Term.Object, Term.NamedNode>;
|
|
1023
|
+
/** Each term's node index. */
|
|
1024
|
+
readonly nodes: HashMap.HashMap<Term.Subject | Term.Object, Graph.NodeIndex>;
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
/**
|
|
1028
|
+
* Converts a dataset to an `effect/Graph` directed graph for graph
|
|
1029
|
+
* algorithms — topological order of a class hierarchy, cycle detection,
|
|
1030
|
+
* shortest paths, reachability, connected components. Every subject and
|
|
1031
|
+
* object becomes one node (equal terms share it) and every quad an edge
|
|
1032
|
+
* from its subject to its object, labelled with its predicate; triple terms
|
|
1033
|
+
* are nodes, not expanded.
|
|
1034
|
+
*
|
|
1035
|
+
* @since 0.1.0
|
|
1036
|
+
* @category graphs
|
|
1037
|
+
*/
|
|
1038
|
+
export const toGraph = (self: Dataset, options: ToGraphOptions = {}): TermGraph => {
|
|
1039
|
+
const keep =
|
|
1040
|
+
options.predicates === undefined ? undefined : HashSet.fromIterable(options.predicates);
|
|
1041
|
+
const edges = Arr.filter(
|
|
1042
|
+
options.graph === undefined ? Arr.fromIterable(self) : match(self, { graph: options.graph }),
|
|
1043
|
+
(q) =>
|
|
1044
|
+
(keep === undefined || HashSet.has(keep, q.predicate)) &&
|
|
1045
|
+
(options.literals === true || !Term.isLiteral(q.object)),
|
|
1046
|
+
);
|
|
1047
|
+
let nodes = HashMap.empty<Term.Subject | Term.Object, Graph.NodeIndex>();
|
|
1048
|
+
const directed = Graph.directed<Term.Subject | Term.Object, Term.NamedNode>((mutable) => {
|
|
1049
|
+
// Equal terms share a node: `nodes` is keyed by term value.
|
|
1050
|
+
const nodeOf = (term: Term.Subject | Term.Object): Graph.NodeIndex =>
|
|
1051
|
+
Option.getOrElse(HashMap.get(nodes, term), () => {
|
|
1052
|
+
const added = Graph.addNode(mutable, term);
|
|
1053
|
+
nodes = HashMap.set(nodes, term, added);
|
|
1054
|
+
return added;
|
|
1055
|
+
});
|
|
1056
|
+
Arr.forEach(edges, (q) => {
|
|
1057
|
+
Graph.addEdge(mutable, nodeOf(q.subject), nodeOf(q.object), q.predicate);
|
|
1058
|
+
});
|
|
1059
|
+
return undefined;
|
|
1060
|
+
});
|
|
1061
|
+
return { graph: directed, nodes };
|
|
1062
|
+
};
|
|
1063
|
+
|
|
1064
|
+
/**
|
|
1065
|
+
* Converts a directed graph whose nodes are terms and whose edges are
|
|
1066
|
+
* predicates back to a dataset: each edge becomes a quad in `graphName` (the
|
|
1067
|
+
* default graph when omitted). Edges from a node that cannot be a subject
|
|
1068
|
+
* (a literal) are left out.
|
|
1069
|
+
*
|
|
1070
|
+
* @since 0.1.0
|
|
1071
|
+
* @category graphs
|
|
1072
|
+
*/
|
|
1073
|
+
export const fromGraph = (
|
|
1074
|
+
source: Graph.DirectedGraph<Term.Subject | Term.Object, Term.NamedNode>,
|
|
1075
|
+
graphName: Term.Graph = Term.defaultGraph,
|
|
1076
|
+
): Dataset =>
|
|
1077
|
+
fromIterable(
|
|
1078
|
+
Arr.flatMap(Arr.fromIterable(Graph.edges(source)), ([, edge]) => {
|
|
1079
|
+
const subject = Graph.getNode(source, edge.source);
|
|
1080
|
+
const object = Graph.getNode(source, edge.target);
|
|
1081
|
+
return Option.isSome(subject) && Option.isSome(object) && Term.isSubject(subject.value)
|
|
1082
|
+
? [Term.quad(subject.value, edge.data, object.value, graphName)]
|
|
1083
|
+
: [];
|
|
1084
|
+
}),
|
|
1085
|
+
);
|