首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

使用 Flash 描述复杂的社交网络-2 实现

使用 Flash 描述复杂的社交网络-2 实现

基于 Flash ActionScript 的实现ActionScript 简介ActionScript 是基于 Adobe Flash Player 运行环境下的编程语言,它是一种类似 JavaScript 并遵循 ECMA 规范的脚本语言。目前最新版本号是 3.0,ActionScript 3.0 使 Flash 开发更接近面向对象设计思想的 Java 语言,由于其新版本引进了面向对象设计思想,它已被广泛运用于 Flash/Flex/AIR 的开发。ActionScript (后文中提到的 ActionScript 都是指 ActionScript 3.0)被 Flash Player 内置的 ActionScript 虚拟机 (AVM) 所执行,这又有点类似于 Java 虚拟机 (JVM)。
本文并不详细讲述 ActionScript 3.0 的语法,如想了解该语言的用法,可以查看 中的相关教程。
GraphML 介绍GraphML ——顾名思义(Graph+XML)是一种基于 XML 且用于描述图(Graph)的通用文件格式。为何要选择 GraphML ?由于 GraphML 并不像其他一些描述图的文件格式,采用的是自定义格式(如 GML),它是完全基于 XML,因此对于生成、存储或是处理图的服务而言,它是一个理想的标准。同时它也非常直观易用,容易被开发者理解和接受,尽管它有着所有基于 XML 文件格式所共有的通病——传输或存储时文件相对过大,不如 Json 和 AMF (Adobe 的一种二进制传输格式)那般轻量级。那么它通常用于描述怎样的图呢?以下作者列出了一些它所支持的图的类型:
  • 有向图(directed graphs)、无向图(undirected graphs)及有向兼无向图;
  • 超图(hypergraphs);
  • 分级图(hierarchical graphs);
  • 图形显示;
  • 为外部数据提供的引用;
  • 作为特定应用的属性数据;
  • 轻量级语法分析器。
而在社交网络中,边(edge)是被定义成人与人之间的关系,这里我们假设甲和乙之间存在一条无向边即表示甲乙相互认识,即这是一幅无向图。因此作者用 GraphML 来描述和存储一个社交网络无向图。
下面来看一个例子:
清单 2. GraphML 例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
            <?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
<!--data schema-->
<key id="e" for="node" attr.name="email" attr.type="string"/>
<key id="w" for="edge" attr.name="weight" attr.type="double">
   <default>1.0</default>
</key>
<graph id="" edgedefault="undirected">
   <!--nodes-->
   <node id="1">
     <data key="e">john@us.ibm.com</data>
   </node>
   <node id="2">
     <! — add profile here -->
   </node>
   <node id="3">
     ...
   </node>
   <!--edges-->
   <edge source="1" target="2">
     <data key="w">1.1</data>
   </edge>
   <edge source="1" target="3" />
</graph>
</graphml>




清单 2 即是一段简单明了的描述无向图的 GraphML 片段,与其对应的网状图即图 3。
图 3. 清单 2 所描述的网状图接下来我们来仔细分析清单 2 中整个 GraphML 的格式和规范:
  • 首先,作为一个 XML,必须得有一个 header,此例中第 1 行描述了该 XML 文档遵循 XML 1.0 标准且它的编码是 UTF-8(XML 文档标准编码),当然用户也可以定义自己的编码;第 2 行包含了一个主节点 graphml 节点,它属于 http://graphml.graphdrawing.org/xmlns 名字空间。
  • 接下来是 GraphML 的核心部分——申明整个图以及其包含所有的点和边。第 8 行中定义了 Graph 的标识符和边默认是否有向,这里标识符必须为空字符串,而 edgedefault="undirected",故为无向边。之后是所有点和边的定义,包括它们的标识符(id)以及边的起始点和目标点的标识符,如第 20 行 <edge source="1" target="2"> 即定义了一条从点"1"至点"2"的无向边。
  • 另外,还可以为点和边附加一些自定义的属性,如每个点所对应人的 email 信息,每条边的权重等。这些属性一般都是以子节点的形式插入相应的点节点和边节点中,如第 11 行点的 email 信息以及第 21 行边的权重值。在插入到点节点和边节点之前,我们首先要在 XML 的伊始处为这些自定义属性作必要声明,如标识符、名称、数据类型、域、甚至默认值等。第 4、5 行即分别是对前述的 email 信息和边的权重的声明,如第 5 行:
    <key id="w" for="edge" attr.name="weight" attr.type="double"><default>1</default></key>
    • 节点名 key 对应文档正文中插入的自定义属性中 data 节点的属性名称 key;
    • id 作为标识符以区分不同的的自定义属性,如 "w" 代表边权重属性;
    • for 代表属性属于的不同域,可以是 graph、node、edge 或 all,这里是 edge,表示只能作为边节点的属性;
    • attr.name 类似 id,描述该属性的名称,目的是标识该属性的文字含义,但值得注意的是它并不在文档中被使用到,替代它作为标识符的是 id;
    • attr.type 指定了该属性的数据类型,可以是 boolean, int, long, float, double, string(即 Java 语言的基本数据类型,在 ActionScript 中相对应的分别是 Boolean, int, uint, Number, Number, String),这里因为是边的权重值,故选择 double 类型;
    • default 声明了该属性的默认值,这里默认值是 1.0。该属性为可选。
返回列表