GraphGists

圣诞老人要来到……银河系

任务

很久以前……圣诞老人在地球上并不忙碌,而且,正如我们所想象的那样,圣诞老人拥有强大的力量。因此,他在大约14 BBY(雅文战役之前)就有时间将自己传送到遥远的银河系。

他的任务是为一对5岁的双胞胎送礼物,他们的家族中拥有强大的原力:阿尔德兰的莱娅·奥加纳和塔图因的卢克·天行者。

不幸的是,银河系的地图只有一份存储在一个机器人中。经过彻底的搜索,圣诞老人找到了这个机器人,但它并不是他正在寻找的那个,这个机器人只拥有银河系的图数据库。

模型

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

view

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

动机

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

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

如果你以不同的方式看待地图会怎样?如果你使用不同的指标和不同的方法来浏览它,不仅探索拓扑结构,还探索数据集的动态会怎样?

数据

数据来自Wookiepedia银河系地图@gorrrgoth做了一项出色的工作)。为了演示,我选取了46个行星的子集,这些行星提供了一些有趣的动态。图如下所示

以下三个部分将解释圣诞老人如何通过与图数据库的力量和原力合作,找到穿越银河系完成任务的最佳路径……

探索银河系

仅从模型上看,圣诞老人知道一个星球属于一个区域,一个扇区包含行星,一个星球隶属于一个政治体系,以及行星通过普通空间或超空间路线分别与其他行星相邻或相邻。但是,他也知道,这些关系并不一定存在于数据集中的所有实体之间。

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

拓扑结构

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

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帝国信用点的税款。

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

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

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

应用

作为一名物理安全专业人员,我对未来的安全系统很感兴趣。我们不能再忽视物理世界和网络世界正在日益融合的事实,安全专家必须进行整体思考。图数据库是实现这一目标的绝佳途径。

我最近发现了一篇由卡门·切赫撰写的优秀论文,名为网络物理拓扑语言:定义和操作,她在其中开发了一种用于建模网络物理系统的本体。我的银河系模型是她工作的初步示例,其中包含网络路径(超空间路线)和物理路径(普通空间)。这些对象具有属性,并且与其他对象相关联,方式类似于此 Gist 中描述的模型。

建筑物和组织拥有不同的系统,可以将其建模为图,但这些系统尚未标准化到可以以唯一的方式建模的程度。与计算机合作,我们可以找到关键资产、渗透时间、攻击指标等。即使不是计算机专家,我也发现 Neo4j 是实现良好安全设计的最有用的工具。


我想留给您一张关于此 gist 的早期规划的图片……

thumbnail?id=0B17R8cRB8tsoTmpLMW5OMmZtUEp1Z0pYZzFzcFhfOXJ0SUpF

愿原力与你同在。