Neo4j可以比MySQL处理更快的现实生活场景

时间:2018-12-07 08:25:40

标签: mysql neo4j

我将讨论Neo4j,我想展示一种场景Neo4j可以比MySQL处理得更快。

我为Twitter之类的“社交网络”创建了随机数据和SQL表: 有1,000,000人,每个人都跟随着另外50个人。 因此,有两个表“ person”和“ following”:

是否有Cypher查询比应该执行相同查询的MySQL查询要快得多?

我尝试过类似“油炸朋友”之类的场景,但是MySQL快速解决了它们……

1 个答案:

答案 0 :(得分:3)

对于rdbms来说,更难的一种情况是不知道要遍历的节点(表)的类型。拿一个具有:Person节点通过不同类型的节点(:Workplace,:Organization,:School等)的不同连接的图,您需要一个可能正在对两个已知节点之间的距离进行可达性查询的查询(这些节点是通过任何方式或通过使用标签和关系类型的子集的某种方式连接?),或通过Kevin Bacon查询或类似方法进行7度的关联。

在编写此类查询时,您对要遍历的节点的了解很少,您想知道它们是否连接以及如何连接,因此您不知道这种连接的确切方式。您如何用SQL编写?通常,您通常需要提前知道要使用的联接表和中间表(特别是如果您必须在某些中间节点上进行属性过滤)。

或者在某些情况下可以以某种程度的通用性对待节点,但仍使用可变长度关系来获得所需的内容呢?

例如,如果您具有:Place节点,它们具有:IN_LOCATION关系,则根据位置和数据的准确性,这些关系可以指向:Address,:City,:State或:Country,并且这些节点本身之间具有:WITHIN关系,您可以尝试获取如下状态信息:

MATCH (p:Place {name:'Yosemite National Park'})-[:IN_LOCATION]->()-[:WITHIN*0..]->(state:State)
RETURN state

在此查询中,您不知道:IN_LOCATION关系指向的左空白节点的标签(类型)。但是,您知道,如果它处于:State级别或以下,则希望继续遍历:WITHIN关系,直到到达:State节点为止(如果初始节点为:State节点,则可能根本不遍历),而不必关心中间节点的类型。

SQL可以做到吗?

此外,使用SQL很难完成一整类图算法和用例,有时甚至用SQL无法完成,因为您通常不太关心要遍历的多种类型的节点。其中包括shortestPath算法,可达性查询,某些类型的最近x节点等。

在某些情况下,也可能会在子图中获取所有连接的节点,无论它们是不受限制的,还是只能通过某些关系访问子图,或者仅由某些节点(或某些节点除外)组成。像这样:

MATCH (k:Person{name:'Keanu Reeves'})-[:ACTED_IN|DIRECTED*..5]-(m:Movie)
RETURN collect(DISTINCT m) as movies