基于 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。该属性为可选。
|