in DataExtraction/SourceGraphExtractionUtils/Utils/DirectedGraph.cs [206:277]
public void WriteJson(JsonWriter jWriter, Dictionary<TNode, int> nodeNumberer,
IEnumerable<Action<JsonWriter, Dictionary<TNode, int>>> additionalNodeInfoWriters,
IEnumerable<(Predicate<TEdgeLabel> acceptsEdgeLabel, Action<JsonWriter, (TNode From, TNode To)> writer)> additionalEdgeInfoWriters)
{
jWriter.WriteStartObject();
// Group by edge type
var edgesByType = new Dictionary<TEdgeLabel, List<(TNode From, TNode To)>>();
foreach (var edge in Nodes.SelectMany(n => GetOutEdges(n)))
{
if (!edgesByType.TryGetValue(edge.Label, out var edgeList))
{
edgeList = new List<(TNode from, TNode to)>();
edgesByType.Add(edge.Label, edgeList);
}
edgeList.Add((edge.Source, edge.Target));
}
// Write Edges
jWriter.WritePropertyName("Edges");
jWriter.WriteStartObject();
foreach (var (edgeType, edges) in edgesByType)
{
jWriter.WritePropertyName(edgeType.ToString());
jWriter.WriteStartArray();
foreach (var (From, To) in edges)
{
jWriter.WriteStartArray();
WriteNodeJson(jWriter, nodeNumberer, From);
WriteNodeJson(jWriter, nodeNumberer, To);
jWriter.WriteEndArray();
}
jWriter.WriteEndArray();
}
jWriter.WriteEndObject();
// Write Edge Values, if any
jWriter.WritePropertyName("EdgeValues");
jWriter.WriteStartObject();
foreach (var (edgeType, edges) in edgesByType)
{
var usedEdgeInfoWriters = additionalEdgeInfoWriters
.Where(edgeWriter => edgeWriter.acceptsEdgeLabel(edgeType))
.Select(e => e.writer).ToArray();
if (usedEdgeInfoWriters.Length == 0)
{
continue;
}
jWriter.WritePropertyName(edgeType.ToString());
jWriter.WriteStartArray();
foreach (var (From, To) in edges)
{
jWriter.WriteStartArray();
foreach (var edgeInfoWriter in usedEdgeInfoWriters)
{
edgeInfoWriter(jWriter, (From, To));
}
jWriter.WriteEndArray();
}
jWriter.WriteEndArray();
}
jWriter.WriteEndObject();
foreach (var additionalWriter in additionalNodeInfoWriters)
{
additionalWriter(jWriter, nodeNumberer);
}
jWriter.WriteEndObject();
}