convert method
override
Converts an RDF graph to a JSON-LD string representation.
This method analyzes the graph structure and automatically determines the most appropriate JSON-LD representation:
- For empty graphs, it returns an empty JSON object
{}
- For graphs with a single subject, it creates a single JSON-LD object with all properties of that subject
- For graphs with multiple subjects, it creates a JSON-LD document with
a top-level
@graph
array containing all subject nodes
The method also:
- Generates consistent labels for blank nodes
- Creates a
@context
object with meaningful prefixes based on the graph content - Groups triples by subject for better structure
- Handles typed literals appropriately
graph
The RDF graph to convert to JSON-LD.
baseUri
Optional base URI for relative IRIs. When provided and
includeBaseDeclaration is true, it will be included in the @context.
Returns a formatted JSON-LD string with 2-space indentation.
Implementation
@override
String convert(RdfGraph graph, {String? baseUri}) {
_log.info('Serializing graph to JSON-LD');
// Return empty JSON object for empty graph
if (graph.isEmpty) {
return '{}';
}
// Map for tracking BlankNodeTerm to label assignments
final Map<BlankNodeTerm, String> blankNodeLabels = {};
_generateBlankNodeLabels(graph, blankNodeLabels);
// Create context with prefixes and optional base URI
final (context: context, compactedIris: compactedIris) = _createContext(
graph,
_options.customPrefixes,
baseUri: baseUri,
includeBaseDeclaration: _options.includeBaseDeclaration,
generateMissingPrefixes: _options.generateMissingPrefixes,
);
// Group triples by subject
final subjectGroups = _groupTriplesBySubject(graph.triples);
// Check if we have only one subject group or multiple
// For a single subject we create a JSON object, for multiple we use a JSON array
if (subjectGroups.length == 1) {
final Map<String, dynamic> result = {'@context': context};
// Add the single subject node
final entry = subjectGroups.entries.first;
final subjectNode = _createNodeObject(
entry.key, entry.value, context, blankNodeLabels,
compactedIris: compactedIris);
result.addAll(subjectNode);
return JsonEncoder.withIndent(' ').convert(result);
} else {
// Create a @graph structure for multiple subjects
final Map<String, dynamic> result = {
'@context': context,
'@graph': subjectGroups.entries.map((entry) {
return _createNodeObject(
entry.key, entry.value, context, blankNodeLabels,
compactedIris: compactedIris);
}).toList(),
};
return JsonEncoder.withIndent(' ').convert(result);
}
}