是否可以将 Cytoscape.js 布局数据直接存储到 app/web 服务器中的文件格式并重新启动相同的布局以最大程度地减少重新计算?

Is it possible to store Cytoscape.js layout data directly to a file format in app/web server and re-launch the same layout to minimize re-computation?

一些 cytoscape 布局是随机的,每次我们启动它时位置都不是固定的。我从多个堆栈溢出问题中了解到,我们可以将布局数据(即包括其位置 x 和 y)保存到浏览器本地存储或会话存储中,以便我们可以使用相同的数据显示相同的布局。

但是,本地存储或会话存储的问题对一个用户来说是好的。但是,想象一下,如果有成千上万的用户使用同一个应用程序,服务器将为每个用户进行大量计算,以将各自的数据存储到各个浏览器。我们能否将数据保存为文件格式直接保存到 app/web 服务器,这样 1000 个用户将看到相同的布局,这也减少了不同数据集的计算。

谢谢。想知道将数据转换成文件并存储在 web/app 服务器中的可能性。

是的,您可以存储位置数据。其实我心里有2个选择。

  1. 使用cy.json()。您可以将元素存储为 JSON,例如 JSON.stringify(cy.json().elements),然后保存此 JSON 字符串。

cy.json().elements 类似于下图

您可以像 cy.json({elements: JSON.parse(jsonStr));

一样轻松恢复此数据
  1. 如您所见,cy.json().elements 有点大。位置数据只是一个像{x: 0, y: 0}这样的小对象。除了 position 之外,它还包含许多其他数据。因此,如果您只需要恢复位置,您可以使用如下代码轻松地手动存储它们。您可以使用 ele.id and node.position() 个函数。
function storePositions() {
  const nodes = cy.nodes(); 
  const nodePositions = {};
  for (let i = 0; i < nodes.length; i++) {
    nodePositions[nodes[i].id()] = nodes[i].position();
  }
  return nodePositions;
}

您还可以轻松恢复节点位置。您可以使用 getElementById and node.position() 函数。

function restorePositions(nodePositions) {
  const nodes = cy.nodes(); 
  const nodePositions = {};
  for (let k in nodePositions) {
    const node = cy.getElementById(k);
    if (node && node.length > 0) {
      node.position(nodePositions[k]);
    }
  }
  return nodePositions;
}