Skip to content

Data Sources ​

Guide to loading data from various sources and formats.

Overview ​

Graphty supports multiple data formats and loading methods. Data can be provided inline, loaded from URLs, or read from files.

Inline Data ​

The simplest way to provide data via HTML attributes:

html
<graphty-element
  node-data='[{"id": "a"}, {"id": "b"}]'
  edge-data='[{"source": "a", "target": "b"}]'>
</graphty-element>

Or via JavaScript properties:

typescript
element.nodeData = [{ id: 'a' }, { id: 'b' }];
element.edgeData = [{ source: 'a', target: 'b' }];

Loading from URL ​

Load graph data from a remote JSON file:

typescript
await graph.loadFromUrl('https://example.com/graph.json');

The JSON file should contain nodes and edges arrays:

json
{
  "nodes": [
    { "id": "node1", "label": "First" },
    { "id": "node2", "label": "Second" }
  ],
  "edges": [
    { "source": "node1", "target": "node2" }
  ]
}

Loading from File ​

Load from a user-uploaded file:

typescript
const fileInput = document.querySelector('input[type="file"]');
fileInput.addEventListener('change', async (e) => {
  const file = e.target.files[0];
  await graph.loadFromFile(file);
});

Supported Formats ​

FormatExtensionDescription
JSON.jsonNative format with nodes/edges arrays
GraphML.graphmlXML-based graph format
GEXF.gexfGephi exchange format
GML.gmlGraph Modeling Language
DOT.dotGraphviz format
CSV.csvComma-separated adjacency
Pajek.netPajek network format

JSON Format (Native) ​

json
{
  "nodes": [
    { "id": "a", "label": "Node A", "category": "type1" },
    { "id": "b", "label": "Node B", "category": "type2" }
  ],
  "edges": [
    { "source": "a", "target": "b", "weight": 1.5 }
  ]
}

GraphML Format ​

xml
<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <graph id="G" edgedefault="directed">
    <node id="n0"/>
    <node id="n1"/>
    <edge source="n0" target="n1"/>
  </graph>
</graphml>

CSV Format ​

Simple edge list:

csv
source,target,weight
a,b,1.0
b,c,2.0
c,a,1.5

Custom ID Paths ​

When your data uses different property names:

typescript
// Data uses 'nodeId', 'from', and 'to' instead of 'id', 'source', 'target'
await graph.loadFromUrl('https://example.com/data.json', {
  nodeIdPath: 'nodeId',
  edgeSrcIdPath: 'from',
  edgeDstIdPath: 'to'
});

Example data:

json
{
  "nodes": [
    { "nodeId": "a", "name": "First" },
    { "nodeId": "b", "name": "Second" }
  ],
  "edges": [
    { "from": "a", "to": "b" }
  ]
}

Incremental Loading ​

Add data without replacing existing nodes:

typescript
// Initial load
await graph.addNodes([{ id: 'a' }]);
await graph.addEdges([]);

// Later, add more data
await graph.addNodes([{ id: 'b' }, { id: 'c' }]);
await graph.addEdges([
  { source: 'a', target: 'b' },
  { source: 'b', target: 'c' }
]);

Clearing Data ​

Remove all nodes and edges:

typescript
await graph.clear();

Data Validation ​

Graphty validates data using Zod schemas. Invalid data will throw descriptive errors:

typescript
try {
  await graph.addNodes([{ /* missing id */ }]);
} catch (error) {
  console.error('Invalid node data:', error.message);
}

Node Data Structure ​

Nodes require an id property. All other properties are optional:

typescript
interface NodeData {
  id: string | number;      // Required, unique identifier
  label?: string;           // Display label
  category?: string;        // For styling/grouping
  x?: number;               // Position (for fixed layout)
  y?: number;
  z?: number;
  [key: string]: any;       // Any additional properties
}

Edge Data Structure ​

Edges require source and target properties:

typescript
interface EdgeData {
  source: string | number;  // Source node ID
  target: string | number;  // Target node ID
  id?: string;              // Optional unique identifier
  weight?: number;          // Edge weight
  label?: string;           // Display label
  [key: string]: any;       // Any additional properties
}

Large Dataset Tips ​

  1. Batch loading: Load nodes before edges
  2. Progressive loading: Load in chunks for very large graphs
  3. Simplify data: Only include properties you need
  4. Pre-compute positions: Use fixed layout for huge graphs
typescript
// Load in batches
const BATCH_SIZE = 1000;
for (let i = 0; i < nodes.length; i += BATCH_SIZE) {
  await graph.addNodes(nodes.slice(i, i + BATCH_SIZE));
}

Custom Data Sources ​

Create your own data source handlers. See Custom Data Sources for details.

Interactive Examples ​