@graphty/graph-io 0.3.25 → 0.3.27
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/README.md +49 -414
- package/dist/chunks/children-CL3Cy0ez.js.map +1 -1
- package/dist/chunks/choose-DrXtu_96.js +56 -0
- package/dist/chunks/choose-DrXtu_96.js.map +1 -0
- package/dist/chunks/constants-ikG85dT8.js +231 -0
- package/dist/chunks/constants-ikG85dT8.js.map +1 -0
- package/dist/chunks/{escape-B-tkk_Cl.js → escape-D1HPTUrP.js} +390 -99
- package/dist/chunks/escape-D1HPTUrP.js.map +1 -0
- package/dist/chunks/export-CHd4tQE2.js +4333 -0
- package/dist/chunks/export-CHd4tQE2.js.map +1 -0
- package/dist/chunks/{importer-eUREhBGj.js → exporter-D23CKNqF.js} +4969 -3201
- package/dist/chunks/exporter-D23CKNqF.js.map +1 -0
- package/dist/chunks/{exporter-DIeGJXAZ.js → exporter-DfWTgrti.js} +23 -21
- package/dist/chunks/exporter-DfWTgrti.js.map +1 -0
- package/dist/chunks/exporter-DhtW6FxK.js +3465 -0
- package/dist/chunks/exporter-DhtW6FxK.js.map +1 -0
- package/dist/chunks/{exporter-BGrsWamJ.js → exporter-IHv4nkCm.js} +38 -229
- package/dist/chunks/exporter-IHv4nkCm.js.map +1 -0
- package/dist/chunks/{importer-BWY2FFc5.js → importer-B1wmPQjr.js} +255 -77
- package/dist/chunks/importer-B1wmPQjr.js.map +1 -0
- package/dist/chunks/{importer-D_e7e7LX.js → importer-B2W_58pz.js} +399 -146
- package/dist/chunks/importer-B2W_58pz.js.map +1 -0
- package/dist/chunks/importer-BSALvkui.js +2811 -0
- package/dist/chunks/importer-BSALvkui.js.map +1 -0
- package/dist/chunks/{importer-vi3bSdtw.js → importer-BVRE--Un.js} +510 -77
- package/dist/chunks/importer-BVRE--Un.js.map +1 -0
- package/dist/chunks/{importer-DET1tg6s.js → importer-CIAzt-wo.js} +1689 -312
- package/dist/chunks/importer-CIAzt-wo.js.map +1 -0
- package/dist/chunks/{importer-DIrbbnAf.js → importer-DpEW5zeG.js} +585 -226
- package/dist/chunks/importer-DpEW5zeG.js.map +1 -0
- package/dist/chunks/{importer-zGLo8Dg_.js → importer-z_FL4VMb.js} +488 -161
- package/dist/chunks/importer-z_FL4VMb.js.map +1 -0
- package/dist/chunks/json-elements-BAmNBZok.js +1225 -0
- package/dist/chunks/json-elements-BAmNBZok.js.map +1 -0
- package/dist/chunks/ontology-export-Bab4eUA8.js +357 -0
- package/dist/chunks/ontology-export-Bab4eUA8.js.map +1 -0
- package/dist/chunks/{records-dbRkxwaq.js → records-CdlvL4RO.js} +298 -114
- package/dist/chunks/records-CdlvL4RO.js.map +1 -0
- package/dist/chunks/{text-Dr0Ifpag.js → text-DzXjAiTl.js} +29 -11
- package/dist/chunks/text-DzXjAiTl.js.map +1 -0
- package/dist/chunks/{writer-C7flM-Ih.js → writer-DxjgHwSe.js} +19 -1
- package/dist/chunks/writer-DxjgHwSe.js.map +1 -0
- package/dist/csv.js +952 -262
- package/dist/csv.js.map +1 -1
- package/dist/cx.js +6 -3
- package/dist/cx2.js +2 -2
- package/dist/cys.js +6 -3
- package/dist/dot.js +1 -1
- package/dist/gexf.js +554 -122
- package/dist/gexf.js.map +1 -1
- package/dist/gml.js +344 -87
- package/dist/gml.js.map +1 -1
- package/dist/graph-io.js +1105 -213
- package/dist/graph-io.js.map +1 -1
- package/dist/graphml.js +3 -2
- package/dist/graphml.js.map +1 -1
- package/dist/json.js +3 -2
- package/dist/neo4j.js +565 -158
- package/dist/neo4j.js.map +1 -1
- package/dist/obo.js +6 -3
- package/dist/pajek.js +1 -1
- package/dist/src/children.d.ts +18 -6
- package/dist/src/children.d.ts.map +1 -1
- package/dist/src/children.js +6 -3
- package/dist/src/children.js.map +1 -1
- package/dist/src/common/attributes.d.ts +29 -11
- package/dist/src/common/attributes.d.ts.map +1 -1
- package/dist/src/common/attributes.js +25 -7
- package/dist/src/common/attributes.js.map +1 -1
- package/dist/src/common/cell-budget.d.ts +9 -2
- package/dist/src/common/cell-budget.d.ts.map +1 -1
- package/dist/src/common/cell-budget.js +11 -3
- package/dist/src/common/cell-budget.js.map +1 -1
- package/dist/src/common/choose.d.ts +19 -0
- package/dist/src/common/choose.d.ts.map +1 -0
- package/dist/src/common/choose.js +72 -0
- package/dist/src/common/choose.js.map +1 -0
- package/dist/src/common/codes.d.ts +456 -66
- package/dist/src/common/codes.d.ts.map +1 -1
- package/dist/src/common/codes.js +458 -66
- package/dist/src/common/codes.js.map +1 -1
- package/dist/src/common/compare.d.ts +81 -0
- package/dist/src/common/compare.d.ts.map +1 -0
- package/dist/src/common/compare.js +394 -0
- package/dist/src/common/compare.js.map +1 -0
- package/dist/src/common/cx-export.d.ts +123 -0
- package/dist/src/common/cx-export.d.ts.map +1 -0
- package/dist/src/common/cx-export.js +334 -0
- package/dist/src/common/cx-export.js.map +1 -0
- package/dist/src/common/declared-types.d.ts +22 -2
- package/dist/src/common/declared-types.d.ts.map +1 -1
- package/dist/src/common/declared-types.js +21 -3
- package/dist/src/common/declared-types.js.map +1 -1
- package/dist/src/common/direction.d.ts +74 -50
- package/dist/src/common/direction.d.ts.map +1 -1
- package/dist/src/common/direction.js +47 -27
- package/dist/src/common/direction.js.map +1 -1
- package/dist/src/common/escape.d.ts +21 -9
- package/dist/src/common/escape.d.ts.map +1 -1
- package/dist/src/common/escape.js +39 -22
- package/dist/src/common/escape.js.map +1 -1
- package/dist/src/common/export.d.ts +144 -32
- package/dist/src/common/export.d.ts.map +1 -1
- package/dist/src/common/export.js +216 -42
- package/dist/src/common/export.js.map +1 -1
- package/dist/src/common/format.d.ts +23 -1
- package/dist/src/common/format.d.ts.map +1 -1
- package/dist/src/common/format.js +26 -1
- package/dist/src/common/format.js.map +1 -1
- package/dist/src/common/ids.d.ts +9 -2
- package/dist/src/common/ids.d.ts.map +1 -1
- package/dist/src/common/ids.js +6 -2
- package/dist/src/common/ids.js.map +1 -1
- package/dist/src/common/input.d.ts +122 -28
- package/dist/src/common/input.d.ts.map +1 -1
- package/dist/src/common/input.js +890 -124
- package/dist/src/common/input.js.map +1 -1
- package/dist/src/common/json-elements.d.ts +144 -20
- package/dist/src/common/json-elements.d.ts.map +1 -1
- package/dist/src/common/json-elements.js +869 -189
- package/dist/src/common/json-elements.js.map +1 -1
- package/dist/src/common/line-format.d.ts +90 -0
- package/dist/src/common/line-format.d.ts.map +1 -0
- package/dist/src/common/line-format.js +185 -0
- package/dist/src/common/line-format.js.map +1 -0
- package/dist/src/common/lists.d.ts +6 -1
- package/dist/src/common/lists.d.ts.map +1 -1
- package/dist/src/common/lists.js +3 -1
- package/dist/src/common/lists.js.map +1 -1
- package/dist/src/common/ontology-export.d.ts +167 -0
- package/dist/src/common/ontology-export.d.ts.map +1 -0
- package/dist/src/common/ontology-export.js +359 -0
- package/dist/src/common/ontology-export.js.map +1 -0
- package/dist/src/common/ontology.d.ts +25 -3
- package/dist/src/common/ontology.d.ts.map +1 -1
- package/dist/src/common/ontology.js +30 -9
- package/dist/src/common/ontology.js.map +1 -1
- package/dist/src/common/options.d.ts +62 -12
- package/dist/src/common/options.d.ts.map +1 -1
- package/dist/src/common/options.js +89 -11
- package/dist/src/common/options.js.map +1 -1
- package/dist/src/common/plural.d.ts +31 -0
- package/dist/src/common/plural.d.ts.map +1 -0
- package/dist/src/common/plural.js +46 -0
- package/dist/src/common/plural.js.map +1 -0
- package/dist/src/common/report.d.ts +72 -14
- package/dist/src/common/report.d.ts.map +1 -1
- package/dist/src/common/report.js +146 -22
- package/dist/src/common/report.js.map +1 -1
- package/dist/src/common/temporal.d.ts +22 -5
- package/dist/src/common/temporal.d.ts.map +1 -1
- package/dist/src/common/temporal.js +13 -2
- package/dist/src/common/temporal.js.map +1 -1
- package/dist/src/common/text.d.ts +39 -23
- package/dist/src/common/text.d.ts.map +1 -1
- package/dist/src/common/text.js +51 -21
- package/dist/src/common/text.js.map +1 -1
- package/dist/src/common/weights.d.ts +37 -4
- package/dist/src/common/weights.d.ts.map +1 -1
- package/dist/src/common/weights.js +61 -2
- package/dist/src/common/weights.js.map +1 -1
- package/dist/src/common/writer.d.ts +19 -3
- package/dist/src/common/writer.d.ts.map +1 -1
- package/dist/src/common/writer.js +30 -2
- package/dist/src/common/writer.js.map +1 -1
- package/dist/src/common/xml.d.ts +125 -9
- package/dist/src/common/xml.d.ts.map +1 -1
- package/dist/src/common/xml.js +402 -85
- package/dist/src/common/xml.js.map +1 -1
- package/dist/src/common/zip.d.ts +44 -4
- package/dist/src/common/zip.d.ts.map +1 -1
- package/dist/src/common/zip.js +134 -5
- package/dist/src/common/zip.js.map +1 -1
- package/dist/src/formats/csv/exporter.d.ts +80 -24
- package/dist/src/formats/csv/exporter.d.ts.map +1 -1
- package/dist/src/formats/csv/exporter.js +146 -33
- package/dist/src/formats/csv/exporter.js.map +1 -1
- package/dist/src/formats/csv/header.d.ts +38 -9
- package/dist/src/formats/csv/header.d.ts.map +1 -1
- package/dist/src/formats/csv/header.js +46 -10
- package/dist/src/formats/csv/header.js.map +1 -1
- package/dist/src/formats/csv/importer.d.ts +187 -37
- package/dist/src/formats/csv/importer.d.ts.map +1 -1
- package/dist/src/formats/csv/importer.js +835 -204
- package/dist/src/formats/csv/importer.js.map +1 -1
- package/dist/src/formats/csv/index.d.ts +100 -19
- package/dist/src/formats/csv/index.d.ts.map +1 -1
- package/dist/src/formats/csv/index.js +94 -21
- package/dist/src/formats/csv/index.js.map +1 -1
- package/dist/src/formats/csv/records.d.ts +95 -10
- package/dist/src/formats/csv/records.d.ts.map +1 -1
- package/dist/src/formats/csv/records.js +333 -122
- package/dist/src/formats/csv/records.js.map +1 -1
- package/dist/src/formats/csv/values.d.ts +1 -0
- package/dist/src/formats/csv/values.d.ts.map +1 -1
- package/dist/src/formats/csv/values.js +1 -0
- package/dist/src/formats/csv/values.js.map +1 -1
- package/dist/src/formats/cx/exporter.d.ts +102 -0
- package/dist/src/formats/cx/exporter.d.ts.map +1 -0
- package/dist/src/formats/cx/exporter.js +1217 -0
- package/dist/src/formats/cx/exporter.js.map +1 -0
- package/dist/src/formats/cx/importer.d.ts +79 -32
- package/dist/src/formats/cx/importer.d.ts.map +1 -1
- package/dist/src/formats/cx/importer.js +682 -287
- package/dist/src/formats/cx/importer.js.map +1 -1
- package/dist/src/formats/cx/index.d.ts +4 -3
- package/dist/src/formats/cx/index.d.ts.map +1 -1
- package/dist/src/formats/cx/index.js +4 -3
- package/dist/src/formats/cx/index.js.map +1 -1
- package/dist/src/formats/cx2/exporter.d.ts +29 -11
- package/dist/src/formats/cx2/exporter.d.ts.map +1 -1
- package/dist/src/formats/cx2/exporter.js +39 -268
- package/dist/src/formats/cx2/exporter.js.map +1 -1
- package/dist/src/formats/cx2/importer.d.ts +78 -28
- package/dist/src/formats/cx2/importer.d.ts.map +1 -1
- package/dist/src/formats/cx2/importer.js +227 -80
- package/dist/src/formats/cx2/importer.js.map +1 -1
- package/dist/src/formats/cx2/index.d.ts +2 -1
- package/dist/src/formats/cx2/index.d.ts.map +1 -1
- package/dist/src/formats/cx2/index.js +2 -1
- package/dist/src/formats/cx2/index.js.map +1 -1
- package/dist/src/formats/cys/constants.d.ts +66 -17
- package/dist/src/formats/cys/constants.d.ts.map +1 -1
- package/dist/src/formats/cys/constants.js +59 -18
- package/dist/src/formats/cys/constants.js.map +1 -1
- package/dist/src/formats/cys/exporter.d.ts +118 -0
- package/dist/src/formats/cys/exporter.d.ts.map +1 -0
- package/dist/src/formats/cys/exporter.js +1072 -0
- package/dist/src/formats/cys/exporter.js.map +1 -0
- package/dist/src/formats/cys/importer.d.ts +22 -8
- package/dist/src/formats/cys/importer.d.ts.map +1 -1
- package/dist/src/formats/cys/importer.js +510 -149
- package/dist/src/formats/cys/importer.js.map +1 -1
- package/dist/src/formats/cys/index.d.ts +4 -2
- package/dist/src/formats/cys/index.d.ts.map +1 -1
- package/dist/src/formats/cys/index.js +4 -2
- package/dist/src/formats/cys/index.js.map +1 -1
- package/dist/src/formats/cys/session.d.ts +46 -7
- package/dist/src/formats/cys/session.d.ts.map +1 -1
- package/dist/src/formats/cys/session.js +101 -27
- package/dist/src/formats/cys/session.js.map +1 -1
- package/dist/src/formats/cys/tables.d.ts +9 -2
- package/dist/src/formats/cys/tables.d.ts.map +1 -1
- package/dist/src/formats/cys/tables.js +29 -7
- package/dist/src/formats/cys/tables.js.map +1 -1
- package/dist/src/formats/dot/exporter.d.ts +42 -14
- package/dist/src/formats/dot/exporter.d.ts.map +1 -1
- package/dist/src/formats/dot/exporter.js +56 -29
- package/dist/src/formats/dot/exporter.js.map +1 -1
- package/dist/src/formats/dot/importer.d.ts +91 -29
- package/dist/src/formats/dot/importer.d.ts.map +1 -1
- package/dist/src/formats/dot/importer.js +190 -39
- package/dist/src/formats/dot/importer.js.map +1 -1
- package/dist/src/formats/dot/index.d.ts +2 -1
- package/dist/src/formats/dot/index.d.ts.map +1 -1
- package/dist/src/formats/dot/index.js +2 -1
- package/dist/src/formats/dot/index.js.map +1 -1
- package/dist/src/formats/dot/names.d.ts +44 -11
- package/dist/src/formats/dot/names.d.ts.map +1 -1
- package/dist/src/formats/dot/names.js +44 -11
- package/dist/src/formats/dot/names.js.map +1 -1
- package/dist/src/formats/dot/tokenizer.d.ts +9 -2
- package/dist/src/formats/dot/tokenizer.d.ts.map +1 -1
- package/dist/src/formats/dot/tokenizer.js +20 -5
- package/dist/src/formats/dot/tokenizer.js.map +1 -1
- package/dist/src/formats/gexf/exporter.d.ts +46 -15
- package/dist/src/formats/gexf/exporter.d.ts.map +1 -1
- package/dist/src/formats/gexf/exporter.js +45 -15
- package/dist/src/formats/gexf/exporter.js.map +1 -1
- package/dist/src/formats/gexf/importer.d.ts +87 -23
- package/dist/src/formats/gexf/importer.d.ts.map +1 -1
- package/dist/src/formats/gexf/importer.js +471 -90
- package/dist/src/formats/gexf/importer.js.map +1 -1
- package/dist/src/formats/gexf/index.d.ts +84 -21
- package/dist/src/formats/gexf/index.d.ts.map +1 -1
- package/dist/src/formats/gexf/index.js +80 -23
- package/dist/src/formats/gexf/index.js.map +1 -1
- package/dist/src/formats/gexf/schema.d.ts +67 -15
- package/dist/src/formats/gexf/schema.d.ts.map +1 -1
- package/dist/src/formats/gexf/schema.js +59 -13
- package/dist/src/formats/gexf/schema.js.map +1 -1
- package/dist/src/formats/gml/exporter.d.ts +69 -21
- package/dist/src/formats/gml/exporter.d.ts.map +1 -1
- package/dist/src/formats/gml/exporter.js +74 -29
- package/dist/src/formats/gml/exporter.js.map +1 -1
- package/dist/src/formats/gml/importer.d.ts +116 -25
- package/dist/src/formats/gml/importer.d.ts.map +1 -1
- package/dist/src/formats/gml/importer.js +290 -61
- package/dist/src/formats/gml/importer.js.map +1 -1
- package/dist/src/formats/gml/index.d.ts +87 -24
- package/dist/src/formats/gml/index.d.ts.map +1 -1
- package/dist/src/formats/gml/index.js +79 -26
- package/dist/src/formats/gml/index.js.map +1 -1
- package/dist/src/formats/gml/syntax.d.ts +67 -18
- package/dist/src/formats/gml/syntax.d.ts.map +1 -1
- package/dist/src/formats/gml/syntax.js +110 -28
- package/dist/src/formats/gml/syntax.js.map +1 -1
- package/dist/src/formats/graphml/constants.d.ts +174 -44
- package/dist/src/formats/graphml/constants.d.ts.map +1 -1
- package/dist/src/formats/graphml/constants.js +165 -44
- package/dist/src/formats/graphml/constants.js.map +1 -1
- package/dist/src/formats/graphml/exporter.d.ts +17 -9
- package/dist/src/formats/graphml/exporter.d.ts.map +1 -1
- package/dist/src/formats/graphml/exporter.js +33 -12
- package/dist/src/formats/graphml/exporter.js.map +1 -1
- package/dist/src/formats/graphml/importer.d.ts +19 -7
- package/dist/src/formats/graphml/importer.d.ts.map +1 -1
- package/dist/src/formats/graphml/importer.js +466 -39
- package/dist/src/formats/graphml/importer.js.map +1 -1
- package/dist/src/formats/graphml/index.d.ts +2 -1
- package/dist/src/formats/graphml/index.d.ts.map +1 -1
- package/dist/src/formats/graphml/index.js +2 -1
- package/dist/src/formats/graphml/index.js.map +1 -1
- package/dist/src/formats/graphml/tree.d.ts +6 -2
- package/dist/src/formats/graphml/tree.d.ts.map +1 -1
- package/dist/src/formats/graphml/tree.js +6 -2
- package/dist/src/formats/graphml/tree.js.map +1 -1
- package/dist/src/formats/graphml/yfiles.d.ts +8 -3
- package/dist/src/formats/graphml/yfiles.d.ts.map +1 -1
- package/dist/src/formats/graphml/yfiles.js +36 -15
- package/dist/src/formats/graphml/yfiles.js.map +1 -1
- package/dist/src/formats/json/dialect.d.ts +88 -24
- package/dist/src/formats/json/dialect.d.ts.map +1 -1
- package/dist/src/formats/json/dialect.js +109 -19
- package/dist/src/formats/json/dialect.js.map +1 -1
- package/dist/src/formats/json/exporter.d.ts +134 -22
- package/dist/src/formats/json/exporter.d.ts.map +1 -1
- package/dist/src/formats/json/exporter.js +135 -54
- package/dist/src/formats/json/exporter.js.map +1 -1
- package/dist/src/formats/json/importer.d.ts +173 -52
- package/dist/src/formats/json/importer.d.ts.map +1 -1
- package/dist/src/formats/json/importer.js +899 -220
- package/dist/src/formats/json/importer.js.map +1 -1
- package/dist/src/formats/json/index.d.ts +3 -2
- package/dist/src/formats/json/index.d.ts.map +1 -1
- package/dist/src/formats/json/index.js +3 -2
- package/dist/src/formats/json/index.js.map +1 -1
- package/dist/src/formats/json/obographs-export.d.ts +68 -0
- package/dist/src/formats/json/obographs-export.d.ts.map +1 -0
- package/dist/src/formats/json/obographs-export.js +941 -0
- package/dist/src/formats/json/obographs-export.js.map +1 -0
- package/dist/src/formats/json/obographs.d.ts +26 -0
- package/dist/src/formats/json/obographs.d.ts.map +1 -1
- package/dist/src/formats/json/obographs.js +297 -80
- package/dist/src/formats/json/obographs.js.map +1 -1
- package/dist/src/formats/neo4j/exporter.d.ts +109 -21
- package/dist/src/formats/neo4j/exporter.d.ts.map +1 -1
- package/dist/src/formats/neo4j/exporter.js +239 -86
- package/dist/src/formats/neo4j/exporter.js.map +1 -1
- package/dist/src/formats/neo4j/header.d.ts +17 -4
- package/dist/src/formats/neo4j/header.d.ts.map +1 -1
- package/dist/src/formats/neo4j/header.js +36 -4
- package/dist/src/formats/neo4j/header.js.map +1 -1
- package/dist/src/formats/neo4j/importer.d.ts +107 -27
- package/dist/src/formats/neo4j/importer.d.ts.map +1 -1
- package/dist/src/formats/neo4j/importer.js +415 -63
- package/dist/src/formats/neo4j/importer.js.map +1 -1
- package/dist/src/formats/neo4j/index.d.ts +73 -23
- package/dist/src/formats/neo4j/index.d.ts.map +1 -1
- package/dist/src/formats/neo4j/index.js +65 -25
- package/dist/src/formats/neo4j/index.js.map +1 -1
- package/dist/src/formats/obo/exporter.d.ts +150 -0
- package/dist/src/formats/obo/exporter.d.ts.map +1 -0
- package/dist/src/formats/obo/exporter.js +1736 -0
- package/dist/src/formats/obo/exporter.js.map +1 -0
- package/dist/src/formats/obo/importer.d.ts +95 -19
- package/dist/src/formats/obo/importer.d.ts.map +1 -1
- package/dist/src/formats/obo/importer.js +475 -104
- package/dist/src/formats/obo/importer.js.map +1 -1
- package/dist/src/formats/obo/index.d.ts +6 -3
- package/dist/src/formats/obo/index.d.ts.map +1 -1
- package/dist/src/formats/obo/index.js +6 -3
- package/dist/src/formats/obo/index.js.map +1 -1
- package/dist/src/formats/obo/syntax.d.ts +108 -4
- package/dist/src/formats/obo/syntax.d.ts.map +1 -1
- package/dist/src/formats/obo/syntax.js +211 -34
- package/dist/src/formats/obo/syntax.js.map +1 -1
- package/dist/src/formats/pajek/exporter.d.ts +54 -16
- package/dist/src/formats/pajek/exporter.d.ts.map +1 -1
- package/dist/src/formats/pajek/exporter.js +67 -35
- package/dist/src/formats/pajek/exporter.js.map +1 -1
- package/dist/src/formats/pajek/importer.d.ts +84 -22
- package/dist/src/formats/pajek/importer.d.ts.map +1 -1
- package/dist/src/formats/pajek/importer.js +303 -83
- package/dist/src/formats/pajek/importer.js.map +1 -1
- package/dist/src/formats/pajek/index.d.ts +2 -1
- package/dist/src/formats/pajek/index.d.ts.map +1 -1
- package/dist/src/formats/pajek/index.js +2 -1
- package/dist/src/formats/pajek/index.js.map +1 -1
- package/dist/src/formats/pajek/syntax.d.ts +77 -14
- package/dist/src/formats/pajek/syntax.d.ts.map +1 -1
- package/dist/src/formats/pajek/syntax.js +186 -54
- package/dist/src/formats/pajek/syntax.js.map +1 -1
- package/dist/src/formats/xgmml/columns.d.ts +1 -0
- package/dist/src/formats/xgmml/columns.d.ts.map +1 -1
- package/dist/src/formats/xgmml/columns.js +4 -0
- package/dist/src/formats/xgmml/columns.js.map +1 -1
- package/dist/src/formats/xgmml/constants.d.ts +186 -56
- package/dist/src/formats/xgmml/constants.d.ts.map +1 -1
- package/dist/src/formats/xgmml/constants.js +181 -57
- package/dist/src/formats/xgmml/constants.js.map +1 -1
- package/dist/src/formats/xgmml/document.d.ts +65 -11
- package/dist/src/formats/xgmml/document.d.ts.map +1 -1
- package/dist/src/formats/xgmml/document.js +157 -28
- package/dist/src/formats/xgmml/document.js.map +1 -1
- package/dist/src/formats/xgmml/emit.d.ts +61 -3
- package/dist/src/formats/xgmml/emit.d.ts.map +1 -1
- package/dist/src/formats/xgmml/emit.js +129 -26
- package/dist/src/formats/xgmml/emit.js.map +1 -1
- package/dist/src/formats/xgmml/exporter.d.ts +13 -6
- package/dist/src/formats/xgmml/exporter.d.ts.map +1 -1
- package/dist/src/formats/xgmml/exporter.js +21 -22
- package/dist/src/formats/xgmml/exporter.js.map +1 -1
- package/dist/src/formats/xgmml/importer.d.ts +33 -12
- package/dist/src/formats/xgmml/importer.d.ts.map +1 -1
- package/dist/src/formats/xgmml/importer.js +35 -72
- package/dist/src/formats/xgmml/importer.js.map +1 -1
- package/dist/src/formats/xgmml/index.d.ts +1 -0
- package/dist/src/formats/xgmml/index.d.ts.map +1 -1
- package/dist/src/formats/xgmml/index.js +1 -0
- package/dist/src/formats/xgmml/index.js.map +1 -1
- package/dist/src/formats/xgmml/values.d.ts +8 -1
- package/dist/src/formats/xgmml/values.d.ts.map +1 -1
- package/dist/src/formats/xgmml/values.js +8 -3
- package/dist/src/formats/xgmml/values.js.map +1 -1
- package/dist/src/index.d.ts +23 -18
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +28 -16
- package/dist/src/index.js.map +1 -1
- package/dist/src/registry.d.ts +478 -92
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/registry.js +807 -88
- package/dist/src/registry.js.map +1 -1
- package/dist/src/sniff.d.ts +61 -19
- package/dist/src/sniff.d.ts.map +1 -1
- package/dist/src/sniff.js +121 -29
- package/dist/src/sniff.js.map +1 -1
- package/dist/src/types.d.ts +362 -112
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.js +28 -7
- package/dist/src/types.js.map +1 -1
- package/dist/xgmml.js +2 -2
- package/docs/samples/README.md +25 -0
- package/docs/samples/got-edges.csv +353 -0
- package/docs/samples/got-network.graphml +1384 -0
- package/docs/samples/got-nodes.csv +108 -0
- package/docs/samples/got.cx +930 -0
- package/docs/samples/got.cx2 +465 -0
- package/docs/samples/got.gexf +471 -0
- package/docs/samples/got.gml +2650 -0
- package/docs/samples/got.json +2546 -0
- package/docs/samples/got.net +461 -0
- package/docs/samples/movies-nodes.csv +9 -0
- package/docs/samples/movies-rels.csv +8 -0
- package/docs/samples/networks.cys +0 -0
- package/docs/samples/proteins.xgmml +9 -0
- package/docs/samples/teams.gv +24 -0
- package/docs/samples/vehicles.obo +25 -0
- package/package.json +9 -4
- package/src/children.ts +18 -6
- package/src/common/attributes.ts +29 -11
- package/src/common/cell-budget.ts +11 -3
- package/src/common/choose.ts +89 -0
- package/src/common/codes.ts +490 -66
- package/src/common/compare.ts +472 -0
- package/src/common/cx-export.ts +432 -0
- package/src/common/declared-types.ts +40 -6
- package/src/common/direction.ts +78 -51
- package/src/common/escape.ts +39 -22
- package/src/common/export.ts +284 -47
- package/src/common/format.ts +30 -1
- package/src/common/ids.ts +14 -3
- package/src/common/input.ts +1057 -134
- package/src/common/json-elements.ts +1035 -199
- package/src/common/line-format.ts +249 -0
- package/src/common/lists.ts +7 -2
- package/src/common/ontology-export.ts +461 -0
- package/src/common/ontology.ts +31 -9
- package/src/common/options.ts +110 -15
- package/src/common/plural.ts +49 -0
- package/src/common/report.ts +168 -25
- package/src/common/temporal.ts +22 -5
- package/src/common/text.ts +62 -23
- package/src/common/weights.ts +74 -4
- package/src/common/writer.ts +37 -3
- package/src/common/xml.ts +479 -90
- package/src/common/zip.ts +169 -7
- package/src/formats/csv/exporter.ts +202 -47
- package/src/formats/csv/header.ts +50 -11
- package/src/formats/csv/importer.ts +1133 -245
- package/src/formats/csv/index.ts +106 -19
- package/src/formats/csv/records.ts +396 -122
- package/src/formats/csv/values.ts +1 -0
- package/src/formats/cx/exporter.ts +1483 -0
- package/src/formats/cx/importer.ts +890 -302
- package/src/formats/cx/index.ts +4 -3
- package/src/formats/cx2/exporter.ts +62 -339
- package/src/formats/cx2/importer.ts +318 -87
- package/src/formats/cx2/index.ts +2 -1
- package/src/formats/cys/constants.ts +62 -17
- package/src/formats/cys/exporter.ts +1368 -0
- package/src/formats/cys/importer.ts +659 -157
- package/src/formats/cys/index.ts +4 -2
- package/src/formats/cys/session.ts +142 -34
- package/src/formats/cys/tables.ts +47 -9
- package/src/formats/dot/exporter.ts +83 -37
- package/src/formats/dot/importer.ts +248 -54
- package/src/formats/dot/index.ts +2 -1
- package/src/formats/dot/names.ts +44 -11
- package/src/formats/dot/tokenizer.ts +25 -6
- package/src/formats/gexf/exporter.ts +57 -18
- package/src/formats/gexf/importer.ts +636 -105
- package/src/formats/gexf/index.ts +90 -21
- package/src/formats/gexf/schema.ts +67 -15
- package/src/formats/gml/exporter.ts +90 -36
- package/src/formats/gml/importer.ts +388 -67
- package/src/formats/gml/index.ts +85 -24
- package/src/formats/gml/syntax.ts +113 -28
- package/src/formats/graphml/constants.ts +178 -44
- package/src/formats/graphml/exporter.ts +52 -18
- package/src/formats/graphml/importer.ts +640 -60
- package/src/formats/graphml/index.ts +2 -1
- package/src/formats/graphml/tree.ts +6 -2
- package/src/formats/graphml/yfiles.ts +37 -15
- package/src/formats/json/dialect.ts +128 -29
- package/src/formats/json/exporter.ts +205 -68
- package/src/formats/json/importer.ts +1163 -253
- package/src/formats/json/index.ts +3 -1
- package/src/formats/json/obographs-export.ts +1197 -0
- package/src/formats/json/obographs.ts +353 -92
- package/src/formats/neo4j/exporter.ts +321 -102
- package/src/formats/neo4j/header.ts +44 -6
- package/src/formats/neo4j/importer.ts +512 -73
- package/src/formats/neo4j/index.ts +75 -23
- package/src/formats/obo/exporter.ts +2210 -0
- package/src/formats/obo/importer.ts +622 -109
- package/src/formats/obo/index.ts +6 -3
- package/src/formats/obo/syntax.ts +232 -37
- package/src/formats/pajek/exporter.ts +90 -42
- package/src/formats/pajek/importer.ts +407 -93
- package/src/formats/pajek/index.ts +2 -1
- package/src/formats/pajek/syntax.ts +216 -55
- package/src/formats/xgmml/columns.ts +10 -0
- package/src/formats/xgmml/constants.ts +183 -56
- package/src/formats/xgmml/document.ts +212 -34
- package/src/formats/xgmml/emit.ts +175 -34
- package/src/formats/xgmml/exporter.ts +36 -28
- package/src/formats/xgmml/importer.ts +64 -86
- package/src/formats/xgmml/index.ts +1 -0
- package/src/formats/xgmml/values.ts +12 -4
- package/src/index.ts +81 -11
- package/src/registry.ts +1121 -135
- package/src/sniff.ts +163 -32
- package/src/types.ts +385 -114
- package/dist/chunks/escape-B-tkk_Cl.js.map +0 -1
- package/dist/chunks/export-Bh60Dv-n.js +0 -582
- package/dist/chunks/export-Bh60Dv-n.js.map +0 -1
- package/dist/chunks/exporter-BGrsWamJ.js.map +0 -1
- package/dist/chunks/exporter-DIeGJXAZ.js.map +0 -1
- package/dist/chunks/importer-BWY2FFc5.js.map +0 -1
- package/dist/chunks/importer-DD-xv9_Y.js +0 -1471
- package/dist/chunks/importer-DD-xv9_Y.js.map +0 -1
- package/dist/chunks/importer-DET1tg6s.js.map +0 -1
- package/dist/chunks/importer-DEcKhsmQ.js +0 -1614
- package/dist/chunks/importer-DEcKhsmQ.js.map +0 -1
- package/dist/chunks/importer-DIrbbnAf.js.map +0 -1
- package/dist/chunks/importer-D_e7e7LX.js.map +0 -1
- package/dist/chunks/importer-eUREhBGj.js.map +0 -1
- package/dist/chunks/importer-vi3bSdtw.js.map +0 -1
- package/dist/chunks/importer-zGLo8Dg_.js.map +0 -1
- package/dist/chunks/json-elements-DDS8N2Dd.js +0 -779
- package/dist/chunks/json-elements-DDS8N2Dd.js.map +0 -1
- package/dist/chunks/ontology-BnrJ4I98.js +0 -113
- package/dist/chunks/ontology-BnrJ4I98.js.map +0 -1
- package/dist/chunks/records-dbRkxwaq.js.map +0 -1
- package/dist/chunks/report-B1z4WT9e.js +0 -2372
- package/dist/chunks/report-B1z4WT9e.js.map +0 -1
- package/dist/chunks/text-Dr0Ifpag.js.map +0 -1
- package/dist/chunks/weights-Dzba96G3.js +0 -176
- package/dist/chunks/weights-Dzba96G3.js.map +0 -1
- package/dist/chunks/writer-C7flM-Ih.js.map +0 -1
|
@@ -29,27 +29,53 @@ import { capabilities, checkCapabilities, LOSS } from "../../common/export.js";
|
|
|
29
29
|
import { formatF32, formatF64, formatInteger } from "../../common/format.js";
|
|
30
30
|
import { isCanonicalIntegerText } from "../../common/ids.js";
|
|
31
31
|
import { resolveExportOptions } from "../../common/options.js";
|
|
32
|
+
import { agree, plural } from "../../common/plural.js";
|
|
32
33
|
import { formatTemporal } from "../../common/temporal.js";
|
|
33
34
|
import { explicitWeights } from "../../common/weights.js";
|
|
34
35
|
import { encodeChunks, joinText } from "../../common/writer.js";
|
|
35
36
|
import { checkRecordSyntax } from "../csv/records.js";
|
|
36
37
|
import { formatHeaderField } from "./header.js";
|
|
37
38
|
import { ID_SPACE_COLUMN, LABELS_COLUMN, TYPE_COLUMN } from "./importer.js";
|
|
38
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Neo4j relationships are always directed, so the edges of an undirected graph, and the undirected edges of a mixed
|
|
41
|
+
* graph, read back as directed.
|
|
42
|
+
* @category Built-in formats
|
|
43
|
+
*/
|
|
39
44
|
export const UNDIRECTED_LOSS = "W_NEO4J_UNDIRECTED_AS_DIRECTED";
|
|
40
|
-
/**
|
|
45
|
+
/**
|
|
46
|
+
* Node ids that read back as a different type, such as the text "7" as the number 7.
|
|
47
|
+
* @category Built-in formats
|
|
48
|
+
*/
|
|
41
49
|
export const ID_TEXT_TYPE_LOSS = ID_TEXT_TYPE_CODE;
|
|
42
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* Two node ids share one text; export() throws E_INVALID_ID.
|
|
52
|
+
* @category Built-in formats
|
|
53
|
+
*/
|
|
43
54
|
export const ID_TEXT_COLLISION_LOSS = ID_TEXT_COLLISION_CODE;
|
|
44
|
-
/**
|
|
55
|
+
/**
|
|
56
|
+
* The `weightColumn` name is already an edge attribute; the save fails.
|
|
57
|
+
* @category Built-in formats
|
|
58
|
+
*/
|
|
45
59
|
export const WEIGHT_COLUMN_TAKEN_LOSS = "E_NEO4J_WEIGHT_COLUMN_TAKEN";
|
|
46
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* The `idColumn` name is already a node attribute; the save fails.
|
|
62
|
+
* @category Built-in formats
|
|
63
|
+
*/
|
|
47
64
|
export const ID_COLUMN_TAKEN_LOSS = "E_NEO4J_ID_COLUMN_TAKEN";
|
|
48
|
-
/**
|
|
65
|
+
/**
|
|
66
|
+
* A node has more than one stored-id column set; only the first is written.
|
|
67
|
+
* @category Built-in formats
|
|
68
|
+
*/
|
|
49
69
|
export const MULTIPLE_ID_PROPERTIES_LOSS = "W_NEO4J_MULTIPLE_ID_PROPERTIES";
|
|
50
|
-
/**
|
|
70
|
+
/**
|
|
71
|
+
* A declared integer type holds non-integral values and is written as double.
|
|
72
|
+
* @category Built-in formats
|
|
73
|
+
*/
|
|
51
74
|
export const DECLARED_TYPE_CHANGED_LOSS = "W_NEO4J_DECLARED_TYPE_CHANGED";
|
|
52
|
-
/**
|
|
75
|
+
/**
|
|
76
|
+
* A list item contains the array delimiter, which Neo4j cannot escape.
|
|
77
|
+
* @category Built-in formats
|
|
78
|
+
*/
|
|
53
79
|
export const ARRAY_DELIMITER_LOSS = "W_NEO4J_ARRAY_DELIMITER";
|
|
54
80
|
/** The roles Neo4j has a slot for: `:TYPE`, `:LABEL` and the id space of `:ID(Space)`. */
|
|
55
81
|
const SLOT_ROLES = new Set(["kind", "labels", "idSpace"]);
|
|
@@ -64,10 +90,11 @@ const ROLE_NAMES = Object.freeze({
|
|
|
64
90
|
idSpace: ID_SPACE_COLUMN,
|
|
65
91
|
});
|
|
66
92
|
/**
|
|
67
|
-
* The capabilities of neo4j-admin CSV
|
|
93
|
+
* The capabilities of neo4j-admin CSV: declared scalar types and
|
|
68
94
|
* arrays; a dict column reads back as string (the header has no enumeration type); a position or
|
|
69
95
|
* visual column is written as a plain property (a point for a 2- or 3-component position) and
|
|
70
96
|
* reads back without its role.
|
|
97
|
+
* @category Built-in formats
|
|
71
98
|
*/
|
|
72
99
|
export const NEO4J_CAPABILITIES = capabilities({
|
|
73
100
|
mixedDirection: false,
|
|
@@ -130,9 +157,10 @@ const PARTS = new Set(["all", "nodes", "relationships"]);
|
|
|
130
157
|
/**
|
|
131
158
|
* Resolve the format options.
|
|
132
159
|
* @param options - the caller's options
|
|
160
|
+
* @param readFrom - the property a Neo4j import read the weights from, the default weightColumn
|
|
133
161
|
* @returns the resolved options; E_UNSUPPORTED for an invalid value
|
|
134
162
|
*/
|
|
135
|
-
function resolveNeo4jExportOptions(options) {
|
|
163
|
+
function resolveNeo4jExportOptions(options, readFrom) {
|
|
136
164
|
const o = options ?? {};
|
|
137
165
|
const part = o.part ?? "all";
|
|
138
166
|
if (!PARTS.has(part)) {
|
|
@@ -148,12 +176,12 @@ function resolveNeo4jExportOptions(options) {
|
|
|
148
176
|
const delimiter = o.delimiter ?? ",";
|
|
149
177
|
const syntax = { ...checkRecordSyntax({ delimiter, quote: o.quote ?? '"' }), delimiter };
|
|
150
178
|
if (syntax.delimiter === arrayDelimiter) {
|
|
151
|
-
throw new GraphFormatError("E_UNSUPPORTED",
|
|
179
|
+
throw new GraphFormatError("E_UNSUPPORTED", `options delimiter and arrayDelimiter must differ: both are ${JSON.stringify(arrayDelimiter)}; pass another arrayDelimiter (";", "," or "|")`, {
|
|
152
180
|
option: "arrayDelimiter",
|
|
153
181
|
found: arrayDelimiter,
|
|
154
182
|
});
|
|
155
183
|
}
|
|
156
|
-
const weightColumn = o.weightColumn === undefined ? "weight" : o.weightColumn;
|
|
184
|
+
const weightColumn = o.weightColumn === undefined ? (readFrom ?? "weight") : o.weightColumn;
|
|
157
185
|
if (weightColumn !== null && (typeof weightColumn !== "string" || weightColumn.length === 0)) {
|
|
158
186
|
throw new GraphFormatError("E_UNSUPPORTED", "option weightColumn: expected a non-empty name or null", {
|
|
159
187
|
option: "weightColumn",
|
|
@@ -211,6 +239,7 @@ class ExportPlan {
|
|
|
211
239
|
roles: SLOT_ROLES,
|
|
212
240
|
roleNames: ROLE_NAMES,
|
|
213
241
|
temporalText: true,
|
|
242
|
+
weights: options.weightColumn !== null,
|
|
214
243
|
});
|
|
215
244
|
this.planColumns("node", snapshot.nodes, this.nodeColumns);
|
|
216
245
|
this.planColumns("edge", snapshot.edges, this.edgeColumns);
|
|
@@ -257,7 +286,7 @@ class ExportPlan {
|
|
|
257
286
|
directionNotes() {
|
|
258
287
|
const { snapshot, folding } = this;
|
|
259
288
|
if (!snapshot.directed) {
|
|
260
|
-
this.note(UNDIRECTED_LOSS, `the snapshot is undirected; every edge is written as a directed relationship (${snapshot.edgeCount} edge(
|
|
289
|
+
this.note(UNDIRECTED_LOSS, `the snapshot is undirected; every edge is written as a directed relationship (${snapshot.edgeCount} edge${plural(snapshot.edgeCount)})`, null, snapshot.edgeCount);
|
|
261
290
|
}
|
|
262
291
|
else if (this.common.onMixedDirection !== "error") {
|
|
263
292
|
let undirected = 0;
|
|
@@ -267,11 +296,11 @@ class ExportPlan {
|
|
|
267
296
|
}
|
|
268
297
|
}
|
|
269
298
|
if (undirected > 0) {
|
|
270
|
-
this.note(UNDIRECTED_LOSS, `${undirected} undirected edge(
|
|
299
|
+
this.note(UNDIRECTED_LOSS, `${undirected} undirected edge${plural(undirected)} ${agree(undirected, "is", "are")} written as one directed relationship each (source to target, a pair folded to its primary); Neo4j has no undirected relationship`, null, undirected);
|
|
271
300
|
}
|
|
272
301
|
}
|
|
273
302
|
if (folding.mutualCount > 0) {
|
|
274
|
-
this.note(LOSS.MUTUAL_EXPANDED, `${folding.mutualCount} mutual pair(
|
|
303
|
+
this.note(LOSS.MUTUAL_EXPANDED, `${folding.mutualCount} mutual pair${plural(folding.mutualCount)} ${agree(folding.mutualCount, "is", "are")} written as two directed relationships; the mutual mark is lost`, null, folding.mutualCount);
|
|
275
304
|
}
|
|
276
305
|
}
|
|
277
306
|
/**
|
|
@@ -444,7 +473,7 @@ class ExportPlan {
|
|
|
444
473
|
}
|
|
445
474
|
}
|
|
446
475
|
if (rows > 0) {
|
|
447
|
-
this.note(ARRAY_DELIMITER_LOSS, `${label}: ${rows} row(
|
|
476
|
+
this.note(ARRAY_DELIMITER_LOSS, `${label}: ${rows} row${plural(rows)} ${agree(rows, "holds", "hold")} an item containing the array delimiter "${arrayDelimiter}", which Neo4j cannot escape`, column.meta.name, rows);
|
|
448
477
|
}
|
|
449
478
|
}
|
|
450
479
|
/**
|
|
@@ -466,7 +495,7 @@ class ExportPlan {
|
|
|
466
495
|
}
|
|
467
496
|
}
|
|
468
497
|
else if (taken !== undefined && name === DEFAULT_WEIGHT_COLUMN) {
|
|
469
|
-
this.note(LOSS.WEIGHT_KEY_CLASH, `edge column "${name}" is written under the property the importer reads
|
|
498
|
+
this.note(LOSS.WEIGHT_KEY_CLASH, `edge column "${name}" is written under the property the importer reads edge weights from (weightFrom "${name}"); it reads back as the weight, not as a column`, name, taken.column.length - taken.column.nullCount);
|
|
470
499
|
}
|
|
471
500
|
return weights.weighted ? weights : null;
|
|
472
501
|
}
|
|
@@ -516,11 +545,11 @@ class ExportPlan {
|
|
|
516
545
|
}
|
|
517
546
|
}
|
|
518
547
|
if (typeChanges > 0) {
|
|
519
|
-
this.note(ID_TEXT_TYPE_LOSS, `${typeChanges} node id(
|
|
548
|
+
this.note(ID_TEXT_TYPE_LOSS, `${typeChanges} node id${plural(typeChanges)} re-import as another type under the canonical id rule (a string of canonical integer text, or a non-integer number)`, null, typeChanges);
|
|
520
549
|
}
|
|
521
550
|
if (collisions > 0) {
|
|
522
|
-
this.note(ID_TEXT_COLLISION_LOSS, `${collisions} node id(
|
|
523
|
-
this.fatalAll = new GraphFormatError("E_INVALID_ID", `${collisions} node id(
|
|
551
|
+
this.note(ID_TEXT_COLLISION_LOSS, `${collisions} node id${plural(collisions)} ${agree(collisions, "shares", "share")} their text with another id (a number and a string); the save fails`, null, collisions);
|
|
552
|
+
this.fatalAll = new GraphFormatError("E_INVALID_ID", `${collisions} node id${plural(collisions)} ${agree(collisions, "shares", "share")} their text with another id; Neo4j ids are text`, { reason: "text collision", count: collisions });
|
|
524
553
|
}
|
|
525
554
|
}
|
|
526
555
|
/** Check that the idColumn option does not name an existing node property. */
|
|
@@ -557,7 +586,7 @@ class ExportPlan {
|
|
|
557
586
|
}
|
|
558
587
|
}
|
|
559
588
|
if (count > 0) {
|
|
560
|
-
this.note(MULTIPLE_ID_PROPERTIES_LOSS, `${count} node(
|
|
589
|
+
this.note(MULTIPLE_ID_PROPERTIES_LOSS, `${count} node${plural(count)} ${agree(count, "has", "have")} more than one stored-id column set; only the first in declaration order is written`, null, count);
|
|
561
590
|
}
|
|
562
591
|
}
|
|
563
592
|
/**
|
|
@@ -654,6 +683,16 @@ class ExportPlan {
|
|
|
654
683
|
* @returns nothing
|
|
655
684
|
*/
|
|
656
685
|
*lines() {
|
|
686
|
+
for (const row of this.rows()) {
|
|
687
|
+
yield row.line;
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
/**
|
|
691
|
+
* The lines of the requested part, each header line tagged with the file it starts.
|
|
692
|
+
* @yields one line at a time, with the file name on a header line
|
|
693
|
+
* @returns nothing
|
|
694
|
+
*/
|
|
695
|
+
*rows() {
|
|
657
696
|
if (this.fatal !== null) {
|
|
658
697
|
throw this.fatal;
|
|
659
698
|
}
|
|
@@ -665,19 +704,51 @@ class ExportPlan {
|
|
|
665
704
|
yield* this.relationshipLines();
|
|
666
705
|
}
|
|
667
706
|
}
|
|
707
|
+
/**
|
|
708
|
+
* The requested part as one file per section kind: a node file per id space (and stored-id
|
|
709
|
+
* property), a relationship file per pair of endpoint id spaces, rows of one kind gathered
|
|
710
|
+
* under one header.
|
|
711
|
+
* @returns the files, node files first
|
|
712
|
+
*/
|
|
713
|
+
files() {
|
|
714
|
+
// keyed by the header row: sections with the same header are one file
|
|
715
|
+
const files = new Map();
|
|
716
|
+
const names = new Set();
|
|
717
|
+
let current = null;
|
|
718
|
+
for (const row of this.rows()) {
|
|
719
|
+
if (row.file !== null) {
|
|
720
|
+
let file = files.get(row.line);
|
|
721
|
+
if (file === undefined) {
|
|
722
|
+
let name = `${row.file.name}.csv`;
|
|
723
|
+
let k = 2;
|
|
724
|
+
while (names.has(name)) {
|
|
725
|
+
name = `${row.file.name}-${k}.csv`;
|
|
726
|
+
k++;
|
|
727
|
+
}
|
|
728
|
+
names.add(name);
|
|
729
|
+
file = { name, kind: row.file.kind, rows: [] };
|
|
730
|
+
files.set(row.line, file);
|
|
731
|
+
}
|
|
732
|
+
current = file;
|
|
733
|
+
}
|
|
734
|
+
else if (current !== null) {
|
|
735
|
+
current.rows.push(row.line);
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
// a part with no rows (a graph without edges) is a header alone, which neo4j-admin does not need
|
|
739
|
+
const written = [...files].filter(([, f], i) => f.rows.length > 0 || (i === 0 && files.size === 1));
|
|
740
|
+
return written.map(([header, f]) => Object.freeze({ name: f.name, kind: f.kind, text: header + f.rows.join("") }));
|
|
741
|
+
}
|
|
668
742
|
/**
|
|
669
743
|
* The node sections.
|
|
670
744
|
* @yields one line at a time
|
|
671
745
|
* @returns nothing
|
|
672
746
|
*/
|
|
673
747
|
*nodeLines() {
|
|
674
|
-
const { snapshot
|
|
675
|
-
const { delimiter } = this.options.syntax;
|
|
676
|
-
const propertyHeaders = nodeColumns.map((plan) => plan.header).join(delimiter);
|
|
748
|
+
const { snapshot } = this;
|
|
677
749
|
let sections = 0;
|
|
678
750
|
let sectionSpace = null;
|
|
679
751
|
let sectionIdName = null;
|
|
680
|
-
const cells = [];
|
|
681
752
|
for (let i = 0; i < snapshot.nodeCount; i++) {
|
|
682
753
|
const space = this.spaceOf(i);
|
|
683
754
|
const stored = this.storedIdOf(i);
|
|
@@ -686,36 +757,48 @@ class ExportPlan {
|
|
|
686
757
|
sections++;
|
|
687
758
|
sectionSpace = space;
|
|
688
759
|
sectionIdName = idName;
|
|
689
|
-
|
|
690
|
-
if (labels !== null) {
|
|
691
|
-
header.push(":LABEL");
|
|
692
|
-
}
|
|
693
|
-
if (propertyHeaders.length > 0) {
|
|
694
|
-
header.push(propertyHeaders);
|
|
695
|
-
}
|
|
696
|
-
yield `${header.join(delimiter)}\n`;
|
|
760
|
+
yield this.nodeHeader(idName, space, space ?? idName);
|
|
697
761
|
}
|
|
698
|
-
|
|
699
|
-
cells.push(this.cell(this.idTextOf(i)));
|
|
700
|
-
if (labels !== null) {
|
|
701
|
-
cells.push(this.cell(this.labelsText(i)));
|
|
702
|
-
}
|
|
703
|
-
for (const plan of nodeColumns) {
|
|
704
|
-
cells.push(this.cell(this.valueText(plan, i)));
|
|
705
|
-
}
|
|
706
|
-
yield `${cells.join(delimiter)}\n`;
|
|
762
|
+
yield { line: this.nodeRow(i), file: null };
|
|
707
763
|
}
|
|
708
764
|
if (sections === 0) {
|
|
709
765
|
// no nodes: one header so the section (and its columns) still exists
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
766
|
+
yield this.nodeHeader(this.options.idColumn ?? "", null, null);
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
/**
|
|
770
|
+
* The header line of a node section, which starts its file.
|
|
771
|
+
* @param idName - the id column's name
|
|
772
|
+
* @param space - the id space, or null
|
|
773
|
+
* @param fileKey - what names the file, or null for the default name
|
|
774
|
+
* @returns the line
|
|
775
|
+
*/
|
|
776
|
+
nodeHeader(idName, space, fileKey) {
|
|
777
|
+
const { delimiter } = this.options.syntax;
|
|
778
|
+
const header = [formatHeaderField(idName, ID_TYPE, space)];
|
|
779
|
+
if (this.labels !== null) {
|
|
780
|
+
header.push(":LABEL");
|
|
781
|
+
}
|
|
782
|
+
const properties = this.nodeColumns.map((plan) => plan.header).join(delimiter);
|
|
783
|
+
if (properties.length > 0) {
|
|
784
|
+
header.push(properties);
|
|
718
785
|
}
|
|
786
|
+
return { line: `${header.join(delimiter)}\n`, file: { kind: "nodes", name: fileName("nodes", fileKey, null) } };
|
|
787
|
+
}
|
|
788
|
+
/**
|
|
789
|
+
* One node's line: the id, the labels, the properties.
|
|
790
|
+
* @param i - the node
|
|
791
|
+
* @returns the line
|
|
792
|
+
*/
|
|
793
|
+
nodeRow(i) {
|
|
794
|
+
const cells = [this.cell(this.idTextOf(i))];
|
|
795
|
+
if (this.labels !== null) {
|
|
796
|
+
cells.push(this.cell(this.labelsText(i)));
|
|
797
|
+
}
|
|
798
|
+
for (const plan of this.nodeColumns) {
|
|
799
|
+
cells.push(this.cell(this.valueText(plan, i)));
|
|
800
|
+
}
|
|
801
|
+
return `${cells.join(this.options.syntax.delimiter)}\n`;
|
|
719
802
|
}
|
|
720
803
|
/**
|
|
721
804
|
* The relationship sections.
|
|
@@ -723,28 +806,11 @@ class ExportPlan {
|
|
|
723
806
|
* @returns nothing
|
|
724
807
|
*/
|
|
725
808
|
*relationshipLines() {
|
|
726
|
-
const { snapshot,
|
|
727
|
-
const { delimiter } = this.options.syntax;
|
|
809
|
+
const { snapshot, folding } = this;
|
|
728
810
|
const list = snapshot.edgeList();
|
|
729
|
-
const propertyHeaders = edgeColumns.map((plan) => plan.header).join(delimiter);
|
|
730
|
-
const weightHeader = weights === null ? null : formatHeaderField(this.options.weightColumn ?? "weight", "double", null);
|
|
731
811
|
let sections = 0;
|
|
732
812
|
let sectionStart = null;
|
|
733
813
|
let sectionEnd = null;
|
|
734
|
-
const cells = [];
|
|
735
|
-
const headerOf = (startSpace, endSpace) => {
|
|
736
|
-
const header = [formatHeaderField("", "START_ID", startSpace), formatHeaderField("", "END_ID", endSpace)];
|
|
737
|
-
if (kind !== null) {
|
|
738
|
-
header.push(":TYPE");
|
|
739
|
-
}
|
|
740
|
-
if (weightHeader !== null) {
|
|
741
|
-
header.push(weightHeader);
|
|
742
|
-
}
|
|
743
|
-
if (propertyHeaders.length > 0) {
|
|
744
|
-
header.push(propertyHeaders);
|
|
745
|
-
}
|
|
746
|
-
return `${header.join(delimiter)}\n`;
|
|
747
|
-
};
|
|
748
814
|
for (let e = 0; e < snapshot.edgeCount; e++) {
|
|
749
815
|
if (folding.folded(e)) {
|
|
750
816
|
continue;
|
|
@@ -757,24 +823,58 @@ class ExportPlan {
|
|
|
757
823
|
sections++;
|
|
758
824
|
sectionStart = startSpace;
|
|
759
825
|
sectionEnd = endSpace;
|
|
760
|
-
yield
|
|
826
|
+
yield this.relationshipHeader(startSpace, endSpace);
|
|
761
827
|
}
|
|
762
|
-
|
|
763
|
-
cells.push(this.cell(this.idTextOf(u)), this.cell(this.idTextOf(v)));
|
|
764
|
-
if (kind !== null) {
|
|
765
|
-
cells.push(this.cell(kind.isSet(e) ? textOf(kind, e) : null));
|
|
766
|
-
}
|
|
767
|
-
if (weights !== null) {
|
|
768
|
-
cells.push(this.cell(weights.text(e)));
|
|
769
|
-
}
|
|
770
|
-
for (const plan of edgeColumns) {
|
|
771
|
-
cells.push(this.cell(this.valueText(plan, e)));
|
|
772
|
-
}
|
|
773
|
-
yield `${cells.join(delimiter)}\n`;
|
|
828
|
+
yield { line: this.relationshipRow(e, u, v), file: null };
|
|
774
829
|
}
|
|
775
830
|
if (sections === 0) {
|
|
776
|
-
yield
|
|
831
|
+
yield this.relationshipHeader(null, null);
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
/**
|
|
835
|
+
* The header line of a relationship section, which starts its file.
|
|
836
|
+
* @param startSpace - the id space of the start nodes, or null
|
|
837
|
+
* @param endSpace - the id space of the end nodes, or null
|
|
838
|
+
* @returns the line
|
|
839
|
+
*/
|
|
840
|
+
relationshipHeader(startSpace, endSpace) {
|
|
841
|
+
const { delimiter } = this.options.syntax;
|
|
842
|
+
const header = [formatHeaderField("", "START_ID", startSpace), formatHeaderField("", "END_ID", endSpace)];
|
|
843
|
+
if (this.kind !== null) {
|
|
844
|
+
header.push(":TYPE");
|
|
845
|
+
}
|
|
846
|
+
if (this.weights !== null) {
|
|
847
|
+
header.push(formatHeaderField(this.options.weightColumn ?? "weight", "double", null));
|
|
848
|
+
}
|
|
849
|
+
const properties = this.edgeColumns.map((plan) => plan.header).join(delimiter);
|
|
850
|
+
if (properties.length > 0) {
|
|
851
|
+
header.push(properties);
|
|
777
852
|
}
|
|
853
|
+
return {
|
|
854
|
+
line: `${header.join(delimiter)}\n`,
|
|
855
|
+
file: { kind: "relationships", name: fileName("relationships", startSpace, endSpace) },
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
/**
|
|
859
|
+
* One relationship's line: the ends, the type, the weight, the properties.
|
|
860
|
+
* @param e - the edge
|
|
861
|
+
* @param u - its source
|
|
862
|
+
* @param v - its target
|
|
863
|
+
* @returns the line
|
|
864
|
+
*/
|
|
865
|
+
relationshipRow(e, u, v) {
|
|
866
|
+
const { kind, weights } = this;
|
|
867
|
+
const cells = [this.cell(this.idTextOf(u)), this.cell(this.idTextOf(v))];
|
|
868
|
+
if (kind !== null) {
|
|
869
|
+
cells.push(this.cell(kind.isSet(e) ? textOf(kind, e) : null));
|
|
870
|
+
}
|
|
871
|
+
if (weights !== null) {
|
|
872
|
+
cells.push(this.cell(weights.text(e)));
|
|
873
|
+
}
|
|
874
|
+
for (const plan of this.edgeColumns) {
|
|
875
|
+
cells.push(this.cell(this.valueText(plan, e)));
|
|
876
|
+
}
|
|
877
|
+
return `${cells.join(this.options.syntax.delimiter)}\n`;
|
|
778
878
|
}
|
|
779
879
|
/**
|
|
780
880
|
* A CSV cell: empty for an unset value, a quoted empty string for a set empty string, the
|
|
@@ -790,7 +890,7 @@ class ExportPlan {
|
|
|
790
890
|
if (text.length === 0) {
|
|
791
891
|
return quote + quote;
|
|
792
892
|
}
|
|
793
|
-
return quoteCsvCell(text, this.options.syntax.delimiter);
|
|
893
|
+
return quoteCsvCell(text, this.options.syntax.delimiter, quote);
|
|
794
894
|
}
|
|
795
895
|
/**
|
|
796
896
|
* The `:LABEL` cell of a node.
|
|
@@ -997,7 +1097,7 @@ function formatPoint(value) {
|
|
|
997
1097
|
parts.push(`${key}:${formatF64(item)}`);
|
|
998
1098
|
}
|
|
999
1099
|
else if (typeof item === "string") {
|
|
1000
|
-
parts.push(`${key}:'${item.
|
|
1100
|
+
parts.push(`${key}:'${item.replaceAll("'", "")}'`);
|
|
1001
1101
|
}
|
|
1002
1102
|
else {
|
|
1003
1103
|
return JSON.stringify(value) ?? "";
|
|
@@ -1040,9 +1140,13 @@ function textOf(column, row) {
|
|
|
1040
1140
|
}
|
|
1041
1141
|
}
|
|
1042
1142
|
}
|
|
1043
|
-
/**
|
|
1143
|
+
/**
|
|
1144
|
+
* The Neo4j exporter.
|
|
1145
|
+
* @category Built-in formats
|
|
1146
|
+
*/
|
|
1044
1147
|
export const neo4jExporter = Object.freeze({
|
|
1045
1148
|
format: NEO4J,
|
|
1149
|
+
options: Object.freeze(["arrayDelimiter", "delimiter", "idColumn", "part", "quote", "weightColumn"]),
|
|
1046
1150
|
capabilities: NEO4J_CAPABILITIES,
|
|
1047
1151
|
/**
|
|
1048
1152
|
* Pre-flight: what export() would lose.
|
|
@@ -1072,6 +1176,45 @@ export const neo4jExporter = Object.freeze({
|
|
|
1072
1176
|
return joinText(plan(snapshot, options).lines());
|
|
1073
1177
|
},
|
|
1074
1178
|
});
|
|
1179
|
+
/**
|
|
1180
|
+
* The file name of a section, without ".csv": the kind, then the id spaces that set it apart.
|
|
1181
|
+
* @param kind - "nodes" or "relationships"
|
|
1182
|
+
* @param first - the id space or id property (nodes), or the start id space (relationships)
|
|
1183
|
+
* @param second - the end id space (relationships)
|
|
1184
|
+
* @returns the name, with characters outside letters, digits, "." , "_" and "-" replaced by "_"
|
|
1185
|
+
*/
|
|
1186
|
+
function fileName(kind, first, second) {
|
|
1187
|
+
const parts = [kind, first ?? "", second ?? ""].filter((p) => p !== "");
|
|
1188
|
+
return parts.join("-").replaceAll(/[^\w.-]/g, "_");
|
|
1189
|
+
}
|
|
1190
|
+
/**
|
|
1191
|
+
* Write a graph as the separate CSV files `neo4j-admin database import` takes: one node file per id
|
|
1192
|
+
* space and one relationship file per pair of endpoint id spaces, each with a single header row.
|
|
1193
|
+
* `exportGraph(snapshot, "neo4j")` writes the same sections into one file, which graph-io reads
|
|
1194
|
+
* back but neo4j-admin does not, since it reads one header per file. The options are the Neo4j
|
|
1195
|
+
* export options (`part` limits the result to the node or the relationship files), and
|
|
1196
|
+
* `checkExport(snapshot, "neo4j", options)` returns what the files lose.
|
|
1197
|
+
* @param snapshot - the graph to write
|
|
1198
|
+
* @param options - the Neo4j export options
|
|
1199
|
+
* @returns the files, node files first
|
|
1200
|
+
* @category Built-in formats
|
|
1201
|
+
* @example
|
|
1202
|
+
* ```ts
|
|
1203
|
+
* for (const file of await exportNeo4jFiles(snapshot)) {
|
|
1204
|
+
* await writeFile(file.name, file.text);
|
|
1205
|
+
* }
|
|
1206
|
+
* // neo4j-admin database import full --nodes=nodes-Movie.csv --nodes=nodes-Person.csv \
|
|
1207
|
+
* // --relationships=relationships-Person-Movie.csv neo4j
|
|
1208
|
+
* ```
|
|
1209
|
+
*/
|
|
1210
|
+
export function exportNeo4jFiles(snapshot, options) {
|
|
1211
|
+
try {
|
|
1212
|
+
return Promise.resolve(plan(snapshot, options).files());
|
|
1213
|
+
}
|
|
1214
|
+
catch (err) {
|
|
1215
|
+
return Promise.reject(err);
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1075
1218
|
/**
|
|
1076
1219
|
* Build the export plan of a snapshot.
|
|
1077
1220
|
* @param snapshot - the snapshot
|
|
@@ -1079,6 +1222,16 @@ export const neo4jExporter = Object.freeze({
|
|
|
1079
1222
|
* @returns the plan
|
|
1080
1223
|
*/
|
|
1081
1224
|
function plan(snapshot, options) {
|
|
1082
|
-
return new ExportPlan(snapshot, resolveNeo4jExportOptions(options), resolveExportOptions(options));
|
|
1225
|
+
return new ExportPlan(snapshot, resolveNeo4jExportOptions(options, weightPropertyOf(snapshot)), resolveExportOptions(options));
|
|
1226
|
+
}
|
|
1227
|
+
/**
|
|
1228
|
+
* The relationship property a Neo4j import read the weights from, when it was not "weight".
|
|
1229
|
+
* @param snapshot - the snapshot
|
|
1230
|
+
* @returns the property name, or null
|
|
1231
|
+
*/
|
|
1232
|
+
function weightPropertyOf(snapshot) {
|
|
1233
|
+
const neo4j = snapshot.meta.extra?.neo4j;
|
|
1234
|
+
const name = neo4j?.weightProperty;
|
|
1235
|
+
return typeof name === "string" && name !== "" ? name : null;
|
|
1083
1236
|
}
|
|
1084
1237
|
//# sourceMappingURL=exporter.js.map
|