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

问题描述 投票:0回答:1

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

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

谢谢你。想知道是否可以将数据转换为文件并存储在网络/应用服务器中。

position restore cytoscape.js
1个回答
1
投票

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

1)使用 cy.json()

您可以将元素存储为 JSON:

JSON.stringify(cy.json().elements)
,然后保存此 JSON 字符串。

cy.json().elements
存储您的数据,如下所示:

您可以轻松恢复此数据,如

cy.json({elements: JSON.parse(jsonStr))

2) 只保存位置数据

如您所见,

cy.json().elements
有点大。位置数据只是像
{x: 0, y: 0}
这样的小对象。除了
position
之外,它还包含许多其他数据。因此,如果您只需要恢复位置,您可以使用如下代码轻松手动存储它们。您可以使用 ele.idnode.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;
}

您还可以轻松恢复节点位置。您可以使用 getElementByIdnode.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;
}
© www.soinside.com 2019 - 2024. All rights reserved.