避免数据集成中的冗余
互联网提供了海量的数据,可以用于许多有趣的应用程序。但是,每当你设计一种独特的分析和呈现方式,而这些信息并非你所拥有或控制时,就存在一种风险:未来某个时候,信息的拥有者可能会提供相同的内容,从而使你的应用程序瞬间变得多余。
正如我们最初在2011年8月报道的,我们的Groupon API数据挖掘项目也遇到了类似的情况。幸运的是,我们项目的核心是一个MapForce图形化数据映射工具。我们可以快速、轻松地调整映射关系,并将其重新利用,以呈现完全不同的数据集,从而提供新的价值。

我们的项目最初的灵感来源于一个观察:Groupon的优惠券通常只在少数特定地点可用,但实际上可以通过网络购买,并购买的商品可以几乎运送到任何地方。
我们使用 MapForce 工具,查询 Groupon API,获取来自所有 Groupon 门店的优惠信息。然后,我们过滤掉了那些被归类为“在线优惠”的商品,并使用 Altova StyleVision 工具,将筛选后的优惠信息以美观的 HTML 页面形式呈现,使其适用于桌面设备和移动设备。
最近在Groupon网页顶部新增的“商品”选项卡,使得我们之前的数据映射变得完全多余,因为它直接提供了来自多个地区的在线商品信息。

更糟糕的是,由于绝大多数商品都在 Groupon 的各个分店都有售,我们的地图现在会生成数十个重复的标注。
重新利用该应用程序
从更宏观的角度来看,我们最初项目的合理性仍然成立:Groupon 按照地理位置来组织和展示优惠活动,但有时,优惠活动本身比地点更具吸引力。例如,也许去宾夕法尼亚州的阿伦镇并不在您的旅行计划中,但如果您知道 Groupon 有一个优惠活动,可以以半价体验在波科诺赛车场驾驶法拉利、兰博基尼或阿斯顿·马丁跑车,进行五到十圈,您会怎么想?
法拉利提供的优惠并非在线优惠,因此它没有出现在“商品”选项卡下,也没有被我们的 MapForce 数据映射程序选中。作为我们数据映射设计的一个新目标,让我们收集所有来自各个地区的 Groupon 优惠,但仅限于那些不被归类为在线优惠的商品。 也许在一些不太为人熟知的地区,也隐藏着许多有趣的事物。 以下是我们在原始数据映射中,用于从 API 获取数据并筛选出在线优惠的部分:

截图中心的代码片段中的 contains 函数用于检查交易描述中是否存在名为 redemptionLocation 的元素,并判断该元素是否包含单词 "Online",以此来确定该交易是否为线上交易。只有当判断结果为真时,该交易才会继续进行后续处理。
位于右上角的“与”运算符将在线优惠信息与一个名为isSoldOut的属性进行比较,从而只选择那些仍然可用的优惠信息(isSoldOut的值为“false”)。
我们可以非常简单地反转已收集的数据集,方法是在 "contains" 函数之后插入一个逻辑非 (logical-not) 函数。新的映射关系会选择所有不包含 "Online" 的交易,这些交易的 "redemptionLocation" 元素中不包含 "Online" 这个关键词。

由于数据结构没有改变,只有内容发生了变化,所以在执行新的映射版本之前,我们无需进行任何其他操作。以下是 XML 输出的一部分,展示了关于法拉利的交易信息:

我们可以将这个输出文件直接导入StyleVision,并使用我们最初的样式表将其转换为HTML文档,但既然我们还在MapForce中,我们再添加两个增强功能。
删除重复数据
我们仍在新的结果中发现一些重复项,这是因为相同的优惠活动经常在大型城市的不同区域同时推出。其中一个使用 MapForce 的示例是一个名为 DistinctArticles.mfd 的映射,它演示了如何从包含重复数据的 XML 数据流中去除重复项。
我们可以轻松地将示例中的设计复制到我们的Groupon页面上

“标题”元素作为唯一的标识符,用于识别重复的交易记录,而“计算时”变量只将第一个副本发送给后续处理模块。
当然,我们也可以将这种去重策略应用于最初的“在线优惠”信息整理,以确定某个地区的“商品”选项卡是否真的包含了所有可用的在线优惠。(事实并非如此。)
数据排序
MapForce 2012 第二版新增了一个功能,允许我们在数据写入输出文件之前对其进行排序。以下是映射配置中的一部分,它首先按照分部名称进行排序,这些分部名称代表 Groupon 的优惠活动地点,然后按照每个地点内的优惠活动标题进行排序。

现在,我们可以处理已完成的映射,并通过将 XML 输出文件与我们最初的 StyleVision 样式表进行转换,生成一个 HTML 文档

也许,在驾驶一辆速度很快的意大利汽车之后,我们还能以优惠的价格买到美味的意大利小吃!MapForce和StyleVision都包含在特别优惠的Altova MissionKit中。亲自体验一下,使用MissionKit集成来自Web API的数据是多么简单—— 下载免费的30天试用版!