GraphGists

圣诞老人即将来到... 星系

任务

很久很久以前…​ 圣诞老人其实在地球上并不忙,而且,正如我们可以想象的,原力在圣诞老人身上很强大。因此,他有时间将自己传送到一个遥远遥远的星系,大约在雅文战役前14年(雅文战役前)。

他的任务是给两个5岁的双胞胎送礼物,原力在他们的家族中很强大:莱娅·奥加纳(位于奥德兰)和卢克·天行者(位于塔图因)。

不幸的是,星系地图只有一份,存储在一个机器人里。经过仔细搜索,圣诞老人找到了那个机器人,但这并不是他要找的机器人,这个机器人只拥有一个星系的图数据库。

模型

经过简短分析,圣诞老人推断出了用于创建该数据库的模型,如下图所示

view

这个模型让圣诞老人对他的任务有了很多了解。

动机

撇开情节不谈,我想解释一下我创建这个Graphgist的主要动机。在现代,收集数据并不十分困难。收集可用数据需要更多工作,但可以做到。然而,发现数据之间的关系有时相当困难,一旦找到这些关系,就更难利用它们。并非所有关系都是显而易见的,计算机在发现新模式和行为方面并不比人类更出色(至少目前如此)。

我们需要与计算机合作,才能真正收集有用的情报并利用数据之间的关系。图数据库是建模数据的自然方式,可以让人类有效利用计算机进行可视化和数据分析。我这里的主要目标是展示用一个非常简单的模型和基本的Cypher查询能做多少事情。

如果你以不同的方式看待地图呢?如果你使用不同的指标和不同的方法来导航,探索的不仅仅是数据集的拓扑结构,还有它的动态特性呢?

数据

数据收集自Wookiepedia(武基百科)星系地图(由@gorrrgoth完成的出色工作)。为了演示,我选取了46个星球的子集,这些星球提供了一些有趣的动态特性。图如下所示

以下三个部分将解释圣诞老人如何通过结合图数据库的力量和原力,在星系中找到最佳路径来完成他的任务…​

探索星系

只需查看模型,圣诞老人就知道一个星球 BELONGS_TO(属于)一个区域,一个扇区 CONTAINS(包含)多个星球,一个星球 AFFILIATED_TO(隶属于)一个政治体系,以及星球通过普通空间或通过超空间航线彼此 NEIGHBOR_OR(相邻)或 ADJACENT_TO(邻近)。然而,他也知道这些关系并非必然存在于数据集中的所有实体之间。

首先要探索的是星系的拓扑结构。

拓扑结构

圣诞老人可以通过非常简单基本的查询了解星球、扇区和区域的数量等基本信息,例如

MATCH (p:Planet) RETURN count(p) as Planets

同样,他可以知道有13个扇区,7个区域和6个政治体系。

接下来他可以问自己的有趣问题是是否有任何孤立的星球

MATCH (p:Planet) WHERE NOT ()-[:ADJACENT_TO|NEIGHBOR_OF]-(p)
RETURN p as IsolatedPlanets

没有。因此,每个星球都可以通过超空间或相当短的普通空间路径到达。接下来,他可以知道人口最稠密的五个扇区

MATCH (s:Sector)-[:CONTAINS]->(p:Planet)
RETURN s.name as Sector, count (p) as No_of_Planets
ORDER BY No_of_Planets DESC LIMIT 5

以及5条更长的超空间航线

MATCH ()-[r:ADJACENT_TO]->()  WITH r.hyperspaceroute AS routes
RETURN DISTINCT(routes) as HyperSpaceroute, count(routes) as length
ORDER BY length DESC LIMIT 5

哪些星球与塔图因属于同一个扇区?

MATCH (s:Sector)-[:CONTAINS]->(p:Planet{name: 'Tatooine'})
MATCH (p1:Planet)<-[:CONTAINS]-(s) WHERE p<>p1
RETURN p1.name as Planet

圣诞老人可以轻松发现,每个星球都属于一个区域,但并非所有星球都包含在一个扇区内。这些星球位于哪些区域?

MATCH (p:Planet)-[:BELONGS_TO]->(r:Region)
WHERE NOT ()-[:CONTAINS]->(p)
RETURN DISTINCT r.name as Region, count(p) as Number_of_Planets
ORDER BY Number_of_Planets DESC

连接最好的星球是哪些?

MATCH (p:Planet)-[rels:ADJACENT_TO|NEIGHBOR_OF*1]->()
RETURN p.name as Planet, count(rels) as Number_of_Connections ORDER BY Number_of_Connections DESC LIMIT 5

由于塔图因连接性高,并且属于人口最稠密的扇区,圣诞老人决定从塔图因出发,然后前往奥德兰

从塔图因到奥德兰使用超空间或普通空间的最短路径如下

MATCH p=shortestPath((p1:Planet{name: 'Tatooine'})-[r:ADJACENT_TO|NEIGHBOR_OF*]-(p2:Planet{name:'Alderaan'}))
RETURN p

动态特性

一旦圣诞老人掌握了星系的拓扑结构,他就可以开始了解其动态特性。通过类似的查询,他可以轻松知道星系中存在不同的政治体系。图数据库的力量在这里可以帮助我们了解,例如,哪个是主导政治力量?

MATCH (p:Planet)-[:AFFILIATED_TO]->(ps:Political_System)
RETURN distinct ps.system as Political_System, count(p) as Affiliated_Planets
ORDER BY Affiliated_Planets DESC

哪些区域在政治上最稳定/最多元化?

MATCH (r:Region)<-[:BELONGS_TO]-()-[:AFFILIATED_TO]->(ps:Political_System)
RETURN r.name as Region, count(DISTINCT ps) as No_of_Political_Systems
ORDER BY No_of_Political_Systems

银河帝国在哪些扇区和区域根基更稳固?

MATCH (r:Region)<-[:BELONGS_TO]-(p:Planet)<-[:CONTAINS]-(s:Sector)
WHERE (p)-[:AFFILIATED_TO]->(:Political_System {system: 'Galactic Empire'})
RETURN distinct r.name as Region, s.name as Sector, count(distinct p) as Planets ORDER BY Planets DESC

与图交互

既然圣诞老人对 可以使用Cypher与图进行交互有了基本了解。然而,一切迹象表明他将不得不与银河帝国打交道。经过一番研究,他发现他需要为沿途遇到的每一个隶属于银河帝国的星球支付100帝国信用点的税。

以总税收为主要指标,最短路径是哪条?

首先,他可以根据每个星球的政治隶属关系设置其“tax”(税收)属性。

MATCH (p:Planet) SET p.tax=0
MATCH (p:Planet)-[:AFFILIATED_TO]->(:Political_System {system:'Galactic Empire'})
SET p.tax=100

现在根据税收指标计算最短路径

MATCH path=(p1:Planet{name: 'Tatooine'})-[r:ADJACENT_TO|NEIGHBOR_OF*1..15]-(p2:Planet{name:'Alderaan'})
RETURN reduce(tax=0, p in nodes(path) | tax+p.tax) AS TotalTax, [p in nodes(path) | p.name] as Planet, [p in nodes(path) | p.tax] as Tax
    ORDER BY TotalTax ASC
    LIMIT 1

(由于Gist服务器限制,我将此查询限制为长度小于或等于15的路径)

圣诞老人注意到这条路径更长(14个星球,而上面找到的是12个),但总税收更少。他可以通过计算之前查询到的最短路径的总税收来轻松验证这一点

MATCH path=shortestpath((p1:Planet{name: 'Tatooine'})-[r:ADJACENT_TO|NEIGHBOR_OF*]-(p2:Planet{name:'Alderaan'}))
RETURN reduce(tax=0, p in nodes(path) | tax+p.tax) AS TotalTax, [p in nodes(path) | p.name] as Planet, [p in nodes(path) | p.tax] as Tax
    ORDER BY TotalTax ASC
    LIMIT 1

这些指标也可以设置在关系中,例如所需的燃料量。我们可以假设在相邻星球之间进行超空间跳跃所需的燃料是普通空间中附近星球的10倍。

因此,他可以在关系中设置以下属性

MATCH ()-[r:ADJACENT_TO]->() SET r.fuel=10
MATCH ()-[r:NEIGHBOR_OF]->() SET r.fuel=1

并使用这个新属性来根据燃料指标查找最短路径,同时也要考虑税收

MATCH path=(p1:Planet{name: 'Tatooine'})-[r:ADJACENT_TO|NEIGHBOR_OF*1..15]-(p2:Planet{name:'Alderaan'})
RETURN reduce(fuel = 0, r in relationships(path)| fuel+r.fuel) AS TotalFuel, reduce(tax=0, p in nodes(path) | tax+p.tax) AS TotalTax, [p in nodes(path) | p.name] as Planet
    ORDER BY TotalTax ASC
    LIMIT 3

对于某些路径,圣诞老人需要支付相同的税费,但他可以根据燃料消耗最少的路径轻松做出决定。

现在,他可以为星系动态的突然变化做好准备。例如,如果帝国突然发现科曼纳不征税并对其进行封锁。圣诞老人可以通过以下查询找到绕过科曼纳的路线,并且始终注意将税费保持在最低

MATCH (commenor:Planet {name:'Commenor'}), path=(p1:Planet{name: 'Tatooine'})-[r:ADJACENT_TO|NEIGHBOR_OF*1..15]-(p2:Planet{name:'Alderaan'})
WHERE NONE(p IN nodes(path) WHERE p=commenor)
RETURN reduce(fuel = 0, r in relationships(path)| fuel+r.fuel) AS TotalFuel, reduce(tax=0, p in nodes(path) | tax+p.tax) AS TotalTax, [p in nodes(path) | p.name] as Planet
    ORDER BY TotalTax ASC
    LIMIT 1

假设圣诞老人在绝地武士团有一些朋友,并且他想拜访一个隶属于该政治体系的星球,他仍然可以通过以下查询添加此条件来优化他的路线

MATCH path=(p1:Planet{name: 'Tatooine'})-[r:ADJACENT_TO|NEIGHBOR_OF*1..15]-(p2:Planet{name:'Alderaan'})
WHERE ANY(p IN nodes(path) WHERE (p)-[:AFFILIATED_TO]-(:Political_System{system: 'Jedi Order'}))
RETURN reduce(fuel = 0, r in relationships(path)| fuel+r.fuel) AS TotalFuel, reduce(tax=0, p in nodes(path) | tax+p.tax) AS TotalTax, [p in nodes(path) | p.name] as Planet
    ORDER BY TotalTax ASC
    LIMIT 3

圣诞老人可以继续使用非常简单的查询来收集关于他旅行的情报。例如使用超空间和普通空间的旅行时间作为指标,如果他在某些星球有朋友可以帮助他获得帝国信用点等。愿图与他同在。

在圣诞老人的图数据库中找到的星系部分图像如下

thumbnail?id=0B17R8cRB8tsoRHVPUVBza2hkRTg

应用

作为一名物理安全专业人士,我对未来的安全系统很感兴趣。我们不能再忽视物理世界和网络世界正在越来越紧密相连的事实,安全专家必须进行整体思考。图数据库是实现这一目标的极佳方式。

我最近发现了一篇卡门·谢(Carmen Cheh)撰写的优秀论文,题为赛博-物理拓扑语言:定义与操作,她在其中开发了一种用于赛博-物理系统建模的本体。我的星系模型是她工作的一个初步示例,其中包含赛博路径(超空间航线)和物理路径(普通空间)。这些对象拥有属性,并以类似于本Gist中所示模型的方式与其他对象相关联。

建筑物和组织有不同的系统,可以建模为图,但这些系统尚未标准化到可以以唯一方式进行建模。通过与计算机协作,我们可以找到关键资产、渗透时间、攻击指标等。即使不是计算机专家,我也认为Neo4j是实现出色安全设计的非常有用的工具。


最后,我想给你们留下一张这个gist早期规划的图片…​

thumbnail?id=0B17R8cRB8tsoTmpLMW5OMmZtUEp1Z0pYZzFzcFhfOXJ0SUpF

愿原力与你同在。

© . All rights reserved.