You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用gvpr/Graphviz筛选含foo的节点及其直接关联节点?

提取指定节点及直接关联节点的Graphviz解决方案

方法一:使用gvpr脚本处理

1. 编写过滤脚本

创建名为filter-foo-related.gvpr的脚本,内容如下:

BEGIN {
  // 收集所有名称包含"foo"的节点到集合A
  node_t A[];
  int nodeCount = 0;
  for (node_t currNode = fstnode(); currNode; currNode = nxtnode(currNode)) {
    if (strstr(currNode.name, "foo") != NULL) {
      A[nodeCount++] = currNode;
    }
  }

  // 标记需要保留的节点:A内节点 + 直接相连的节点
  for (int i = 0; i < nodeCount; i++) {
    node_t targetNode = A[i];
    targetNode.keep = 1; // 标记目标节点保留

    // 标记所有出边指向的节点
    for (edge_t outEdge = fstout(targetNode); outEdge; outEdge = nxtout(outEdge)) {
      outEdge.head.keep = 1;
    }
    // 标记所有入边来源的节点
    for (edge_t inEdge = fstin(targetNode); inEdge; inEdge = nxtin(inEdge)) {
      inEdge.tail.keep = 1;
    }
  }
}

// 删除未标记的节点
N {
  if (!N.keep) {
    delete(N);
  }
}

// 删除两端节点都被移除的边
E {
  if (!E.tail.keep || !E.head.keep) {
    delete(E);
  }
}

2. 执行处理命令

在终端运行以下命令,将bar.dot处理后输出到新文件:

gvpr -f filter-foo-related.gvpr bar.dot > filtered-bar.dot

3. 验证输出结果

可以用Graphviz将处理后的DOT文件转为可视化图片:

dot -Tpng filtered-bar.dot -o filtered-bar.png

方法二:直接使用gvpr命令行参数

如果不想创建单独脚本,可将逻辑直接写入命令行:

gvpr 'BEGIN{node_t A[];int c=0;for(n=fstnode();n;n=nxtnode(n))if(strstr(n.name,"foo"))A[c++]=n;for(int i=0;i<c;i++){A[i].keep=1;for(e=fstout(A[i]);e;e=nxtout(e))e.head.keep=1;for(e=fstin(A[i]);e;e=nxtin(e))e.tail.keep=1;}}N{if(!N.keep)delete(N);}E{if(!E.tail.keep||!E.head.keep)delete(E);}' bar.dot > filtered-bar.dot

内容的提问来源于stack exchange,提问作者pseudorandomdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 15:29:58