in packages/graph-explorer/src/connector/gremlin/fetchSchema/index.ts [156:243]
displayLabel: sanitizeText(name),
dataType:
typeof value === "string"
? "String"
: TYPE_MAP[value["@type"]] || "String",
};
}),
});
}
}
remoteLogger.info(
`[Gremlin Explorer] Found ${vertices.flatMap(v => v.attributes).length} vertex attributes across ${vertices.length} vertex types.`
);
return vertices;
};
const fetchVerticesSchema = async (
gremlinFetch: GremlinFetch,
remoteLogger: LoggerConnector
): Promise<SchemaResponse["vertices"]> => {
const countsByLabel = await fetchVertexLabels(gremlinFetch, remoteLogger);
const labels = Object.keys(countsByLabel);
return fetchVerticesAttributes(
gremlinFetch,
remoteLogger,
labels,
countsByLabel
);
};
const fetchEdgeLabels = async (
gremlinFetch: GremlinFetch,
remoteLogger: LoggerConnector
): Promise<Record<string, number>> => {
const labelsTemplate = edgeLabelsTemplate();
remoteLogger.info("[Gremlin Explorer] Fetching edge labels with counts...");
const data = await gremlinFetch<RawEdgeLabelsResponse>(labelsTemplate);
const values = data.result.data["@value"][0]["@value"];
const labelsWithCounts: Record<string, number> = {};
for (let i = 0; i < values.length; i += 2) {
labelsWithCounts[values[i] as string] = (values[i + 1] as GInt64)["@value"];
}
remoteLogger.info(
`[Gremlin Explorer] Found ${Object.keys(labelsWithCounts).length} edge labels.`
);
return labelsWithCounts;
};
const fetchEdgesAttributes = async (
gremlinFetch: GremlinFetch,
remoteLogger: LoggerConnector,
labels: Array<string>,
countsByLabel: Record<string, number>
): Promise<SchemaResponse["edges"]> => {
const edges: SchemaResponse["edges"] = [];
if (labels.length === 0) {
return edges;
}
// Batch in to sets of 100
const batches = chunk(labels, BATCH_SIZE);
remoteLogger.info("[Gremlin Explorer] Fetching edges attributes...");
for (const batch of batches) {
const edgesTemplate = edgesSchemaTemplate({
types: batch,
});
const data = await gremlinFetch<RawEdgesSchemaResponse>(edgesTemplate);
const edgesSchemas = data.result.data["@value"][0]["@value"];
for (let i = 0; i < edgesSchemas.length; i += 2) {
const label = edgesSchemas[i] as string;
const vertex = edgesSchemas[i + 1] as GEdge;
const properties = vertex["@value"].properties;
edges.push({
type: label,
displayLabel: sanitizeText(label),
total: countsByLabel[label],
attributes: Object.entries(properties || {}).map(([name, prop]) => {
const value = prop["@value"].value;
return {