GoJS教程[2019]:使用GraphObjects构建零件

下载GoJS最新版本

    您可以在传统的JavaScript代码中构造Node或其他类型的Part。 GoJS还提供了一种更具声明性的构建部件方式,与代码相比具有多个优势。

    本文将讨论可用于构建节点的基本对象类型。这些页面通过显式创建和添加节点和链接来构建图表。后面的页面将展示如何使用模型而不是使用此类代码来构建图表。

节点和链接的可视化结构

    首先,查看包含有关用于构建一些示例节点和链接的GraphObject的注释的图表:

Visual Paradigm

    如您所见,节点或链接可以由许多GraphObject组成,包括可以嵌套的Panel。您可以拖动任何注释,以便在注释链接的末尾看到GraphObject所覆盖的区域,但链接本身中的GraphObjects除外。

用代码构建

    GraphObject是可以被构造和任何其他对象以相同的方式初始化的JavaScript对象。一个节点是一个GraphObject包含GraphObject S,从而为TextBlock的 S,形状 S, 图片 s和面板 s表示可能还包含更多GraphObjects。

    一个非常简单的Node可能包含Shape和TextBlock。您可以使用以下代码构建GraphObjects的这种可视化树:

var node = new go.Node(go.Panel.Auto);  var shape = new go.Shape();
  shape.figure = "RoundedRectangle";
  shape.fill = "lightblue";
  node.add(shape);  var textblock = new go.TextBlock();
  textblock.text = "Hello!";
  textblock.margin = 5;
  node.add(textblock);
  diagram.add(node);

Visual Paradigm

    虽然以这种方式构建节点将起作用,但随着节点变得更复杂,代码将变得更加复杂以便阅读和维护。幸运的是,GoJS有更好的方法从GraphObjects制作零件。

此外,后面的部分将讨论如何使用模型,模板和数据绑定自动创建节点和链接。在此之前,这些页面将显式创建节点并直接将它们添加到Diagrams。

使用GraphObject.make构建

    GoJS定义了一个静态函数GraphObject.make,它在构造GraphObjects时非常有用,而不必考虑和跟踪临时变量名。此静态函数还支持以嵌套方式构建对象,其中缩进为您提供有关可视树中深度的线索,与上面显示的简单线性代码不同。

    GraphObject.make是一个函数,其第一个参数必须是类类型,通常是GraphObject的子类。

    GraphObject.make的 其他参数可能有以下几种类型:

  • 具有属性/值对的纯JavaScript对象 - 在要构造的对象上设置这些属性值
  • 一个GraphObject,作为元素添加到正在构造的Panel中
  • 一个GoJS枚举值常量,用作可以接受这样一个值的正在构造的对象的唯一属性的值
  • 一个字符串,用于设置正在构造的对象的TextBlock.text,Shape.figure,Picture.source或Panel.type属性
  • 一个RowColumnDefinition,用于描述在表的行或列面板小号
  • 一个JavaScript数组,保存GraphObject.make的参数,在从函数返回多个参数时很有用
  • 以适当方式用于正在构造的对象的其他专用对象

    我们可以使用go.GraphObject.make重写上面的代码,以产生完全相同的结果:

 var $ = go.GraphObject.make;
  diagram.add(
    $(go.Node, go.Panel.Auto,
      $(go.Shape,
        { figure: "RoundedRectangle",          fill: "lightblue" }),
      $(go.TextBlock,
        { text: "Hello!",          margin: 5 })
    ));

Visual Paradigm

    通过使用字符串参数可以简化这一点:

Visual Paradigm

var $ = go.GraphObject.make;
  diagram.add(
    $(go.Node, "Auto",
      $(go.Shape, "RoundedRectangle", { fill: "lightblue" }),
      $(go.TextBlock, "Hello!", { margin: 5 })
    ));

Visual Paradigm

    注意我们如何通过使用字符串值来设置Panel.type,Shape.figure和TextBlock.text属性。

    使用$作为go.GraphObject.make的缩写是非常方便的,我们将从现在开始使用它。将go.GraphObject.make调用最小化为单个字符有助于消除代码中的混乱,并使缩进与正在构造的可视树中的GraphObject的嵌套匹配 。

    其他一些JavaScript库自动将“$”定义为一个方便的类型函数名称,假设它们是唯一重要的库。但是,当然,你不能让同一个符号在同一范围内同时具有两种不同的含义。因此,您可能希望在使用GoJS时选择使用其他短名称,例如“$$”或“GO” 。该GoJS文档和示例使用“$”,因为它使生成的代码最清楚。

    使用GraphObject.make的另一个好处是,它将确保您设置的任何属性都是类的定义属性。如果属性名称中有拼写错误,则会抛出错误,您可以在控制台日志中看到一条消息。

    GraphObject.make也可用于构建除继承自GraphObject的GoJS类之外的GoJS类。下面是使用go.GraphObject.make构建Brush 而不是GraphObject子类的示例。

diagram.add(
    $(go.Node, "Auto",
      $(go.Shape, "RoundedRectangle",
        { fill: $(go.Brush, "Linear",
                  { 0.0: "Violet", 1.0: "Lavender" }) }),
      $(go.TextBlock, "Hello!",
        { margin: 5 })
    ));

Visual Paradigm

    使用GraphObject.make构建Diagram也很常见。在这样的用法中,字符串参数(如果提供的话必须是第二个参数)将命名图应该使用的DIV HTML元素。等效地,您可以将对DIV元素的直接引用作为第二个参数传递。

    此外,在图表上设置属性时,您可以使用属性名称,这些属性名称由两个以句点分隔的标识符组成。句点之前的名称用作图表或Diagram.toolManager上的属性名称,该图表返回要设置其属性的对象。句点后面的名称是设置的属性的名称。请注意,由于存在嵌入的句点,因此JavaScript属性语法要求您使用引号。

    您还可以声明DiagramEvent听众,仿佛呼唤Diagram.addDiagramListener,假装设置图表属性,它实际上是一个DiagramEvent的名称。因为所有DiagramEvent都具有大写的名称,所以名称不会与任何Diagram属性名称冲突。

    以下是GraphObject.make用于构建图表的适度广泛用法:

var myDiagram =
    $(go.Diagram, "myDiagramDiv",  // must name or refer to the DIV HTML element
      {
        // don't initialize some properties until after a new model has been loaded
        "InitialLayoutCompleted": loadDiagramProperties,  // a DiagramEvent listener

        // have mouse wheel events zoom in and out instead of scroll up and down
        "toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,

        // specify a data object to copy for each new Node that is created by clicking
        "clickCreatingTool.archetypeNodeData": { text: "new node" }
      });

  // the DiagramEvent listener for "InitialLayoutCompleted"
  function loadDiagramProperties(e) { . . . }

    使用GraphObject.make进行的所有这些初始化仍然是JavaScript代码,因此我们可以调用函数并轻松共享诸如画笔之类的对象:

var violetbrush = $(go.Brush, "Linear", { 0.0: "Violet", 1.0: "Lavender" });

  diagram.add(
    $(go.Node, "Auto",
      $(go.Shape, "RoundedRectangle",
        { fill: violetbrush }),
      $(go.TextBlock, "Hello!",
        { margin: 5 })
    ));

  diagram.add(
    $(go.Node, "Auto",
      $(go.Shape, "Ellipse",
        { fill: violetbrush }),
      $(go.TextBlock, "Goodbye!",
        { margin: 5 })
    ));

GoJS

    可以共享Brush es和Geometry对象,但可能不共享GraphObject。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
近日,DeepMind 和谷歌联合进行了一项研究,该研究提出了一种执行相似性学习的新型强大模型——图匹配网络(GMN),性能优于 GNN 和 GCN 模型。该论文已被 ICML 2019 接收。 DeepMind 和谷歌的这项新研究聚焦检索和匹配图结构对象这一极具挑战性的问题,做出了两个重要贡献。 首先,研究者展示了如何训练图神经网络(GNN),使之生成可在向量空间中执行高效相似性推理的图嵌入。其次,研究者提出了新型图匹配网络模型(GMN),该模型以一对图作为输入,通过基于跨图注意力的新型匹配机制进行联合推理,从而计算它们之间的相似性分数。 研究者证明 GMN 模型在不同领域中的有效性,包括极具挑战性的基于控制流图的函数相似性搜索问题,这个问题在检索软件系统的漏洞中起着非常重要的作用。实验分析表明 GMN 模型不止能在相似性学习的环境下利用结构,还能超越针对这些问题手动精心设计的特定领域基线系统。研究主题:图相似性学习问题 图是编码关系结构的自然表征,常常出现在多个领域中。根据图结构数据定义的计算可以用在各种领域中,从计算生物学和化学的分子分析到自然语言理解中知识图或图结构解析的分析都可以。 近几年来,图神经网络(Graph Neural Network,GNN)已经成为可以有效学习结构数据表征、解决各种基于图的监督预测问题的模型了。这样的模型在迭代聚合局部结构信息的传播过程中设计并计算图节点表征,从而对图元素的排列(permutation)具有不变性。然后直接将这些节点表征用于节点分类,或者将它们合并到用于图分类的图向量中。而 GNN 在监督分类或回归以外的问题的相关研究相对较少。 DeepMind 的这篇论文研究的是图结构对象的相似性学习问题,这个问题在现实生活中有很多重要的应用,尤其是在图数据库中基于相似性的搜索。还有一个应用是涉及计算机安全的二元函数相似性搜索,给定的二元函数可能包含有已知漏洞的代码,我们要检查这个二元函数中是否有和已知易受攻击的函数相似的控制流图(control-flow-graph)。这有助于识别闭源软件中易受攻击的静态连结函式库,这是一个很常见的问题 (CVE, 2010; 2018),现在还没有很好的解决方法。图 1 展示了一个例子,在这个例子中用汇编语言注释的控制流图来表示二元函数。这种相似性学习问题极具挑战性,因为就算是图之间细微的差别也会造成语义上极大的不同,但结构不同的图语义上可能非常相似。因此,对这个问题而言,一个成功的模型应该(1)利用图结构;(2)能从图的结构和学习到的语义中推导出图的相似性。图 1:二元函数相似性学习问题。检查两个图是否相似需要推理图的结构和语义。左边两个控制流图对应使用不同编译器编译的相同函数(因此二者比较相似),但右侧图对应的是不同函数。 解决方案 为了解决图相似性学习问题,该论文研究了 GNN 在这种情况中的使用,探讨了如何用 GNN 将图嵌入到向量空间,并学习这种嵌入模型,从而使向量空间中相似的图靠近、不相似的图分开。这个模型的一个重要特性是它可以将每一个图独立地映射到一个嵌入向量,然后在向量空间中执行相似性计算。因此,可以预先计算并索引大型数据库中的图嵌入,这样就能用快速的最近邻搜索数据结构(如 k-d 树) 或局部敏感哈希算法 (Gionis et al., 1999) 执行高效的检索。 研究者进一步扩展 GNN,提出新型图匹配网络(Graph Matching Networks,GMN)来执行相似性学习。GMN 没有单独计算每个图的图表征,它通过跨图注意力机制计算相似性分数,来关联图之间的节点并识别差异。该模型依赖成对图计算图表征,因此它比嵌入模型更强大,并在准确率和计算之间做出了很好的权衡。 研究者在三个任务上评估了 GMN 和基线模型:仅捕获结构相似性的合成图编辑距离学习任务(synthetic graph edit-distance learning tas),以及两个现实世界任务——二元函数相似性搜索和网格检索,这两项任务都需要推理结构相似性和语义相似性。在所有任务中,GMN 都比基线和结构不可知(structure agnostic)模型的性能更好。在更详细的模型简化测试中,研究者发现 GMN 始终优于图嵌入模型和 Siamese 网络。 该研究的贡献如下: 展示了如何用 GNN 产生用于相似性学习的图嵌入; 提出了新型图匹配网络(GMN),该网络基于跨图注意力匹配来计算相似性; 实验证明,该研究提出的图相似性学习模型 GMN 在多个应用中都有良好的表现,比结构不可知模型和现有的手动建立的基线模型都要好。 深度图相似性学习 给定两个图 G1 = (V1, E1) 和 G2 = (V2, E2),我们需要一个可以计算两图之间相似性分数 s(G1, G2) 的模型。每个图 G = (V, E) 被表示为节点 V 和边 E 的集合,每个节点 i∈V 都可以和特征向量 x_i 相关联,每条边 (i, j) ∈ E 都可以和特征向量 x_ij 关联起来。这些特征可以表示节点类型、边的方向等。如果一个节点或者一条边不能关联任何特征,那么我们可以将对应向量设置成值为 1 的常量。研究者提出了两个图相似性学习模型:一个是基于标准 GNN 的学习图嵌入的模型;另一个是更为崭新也更加强大的 GMN。图 2 展示了这两个模型:图嵌入模型 图嵌入模型可以将每一个图都嵌入到向量中,然后用向量空间中的相似性矩阵衡量图之间的相似性。GNN 嵌入模型包括三个部分:编码器、传播层和聚合器。 图匹配网络 图匹配网络以一对图作为输入,计算它们之间的相似性分数。和嵌入模型相比,图匹配模型联合成对图计算相似性分数,而不是先将每个图独立地映射到向量上。因此,图匹配模型可能比嵌入模型更加强大,但它需要额外的计算效率。 图匹配网络改变了每个传播层中的节点更新模块,这样不仅可以考虑到每个图的边上的聚合信息,还可以考虑到衡量一个图中的一个节点和其他图中的一或多个节点匹配近日,DeepMind 和谷歌联合进行了一项研究,该研究提出了一种执行相似性学习的新型强大模型——图匹配网络(GMN),性能优于 GNN 和 GCN 模型。该论文已被 ICML 2019 接收。 程度的跨图匹配向量:以调整图的表征,在它们不匹配时放大它们之间的差异。 实验 研究者在三个任务上评估了图相似性学习(Graph Similarity Learning,GSL)框架、图嵌入模型(GNN)以及图匹配网络(GMN)的性能,并将这些模型与其他方法进行了对比。总体上,实验结果表明在图相似性学习任务上,GMN 表现优异,而且始终优于其他方法。 学习图编辑距离(GED) 图 G1 和 G2 之间的图编辑距离即将 G1 变换为 G2 所需的最小编辑操作。通常这些编辑操作包括添加/移除/替换节点和边。图编辑距离是衡量图之间相似性的自然指标,在图相似性搜索中有很多应用。 从下表 1 中可以看出,通过学习特定分布的图,GSL 模型的性能优于一般的基线模型,而 GMN 的性能持续优于图嵌入模型(GNN)。基于控制流图的二元函数相似性搜索 二元函数相似性搜索是计算机安全领域中的重要问题。当我们无法获取源代码时,可以通过二元函数执行分析和搜索,例如在处理商业或嵌入式软件或可疑的可执行程序时。 下图 4 展示了具备不同传播步和不同数据设置的不同模型在二元函数相似性搜索任务上的性能。从图中,我们可以看到: 图嵌入模型和图匹配模型的性能随着传播步的增加而持续提升; 在传播步足够的情况下,图嵌入模型持续优于基线模型; 图匹配模型在所有设置和传播步的情况下都优于图嵌入模型。研究者检测了GMN 模型中不同组件的效果,并将 GMN 模型与图卷积网络(GCN)、图神经网络(GNN)和 GNN/GCN 嵌入模型的 Siamese 版本进行对比。 下表 2 展示了实验结果,表明: GNN 嵌入模型是具备竞争力的模型(比 GCN 模型强大); 使用 Siamese 网络架构基于图表征学习相似性要比使用预先指定的相似性指标(Euclidean、Hamming 等)好; GMN 优于Siamese 模型,这表明在计算过程早期进行跨图信息交流是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值