创建以下MATCH语句的最有效方式是什么,为什么?

列维·罗伯茨(Levi Roberts)

问题:
创建以下MATCH语句的最有效方式是什么?为什么?

详细的问题:
假设我们有一个Place具有可变数量属性节点,并且需要按其类别从潜在的数十亿个节点中查找节点。我试图把每个查询的性能都放在脑子里,事实证明这很困难。

可能的查询:

  • Place使用property查找匹配节点
    MATCH (entity:Place { category: "Food" })

  • 匹配Place具有以下isCategory关系的Food节点:
    MATCH (entity:Place)-[:isCategory]->(category:Food)

  • 匹配Place具有以下Food关系的Category节点:
    MATCH (entity)-[category:Food]->(:Category)

  • 匹配Food具有以下isCategoryFor关系的Place节点:
    MATCH (category:Food)-[:isCategoryFor]->(entity:place)

显然,两者之间的所有变化。关系方向也朝着相反的方向发展。

更高的复杂度:
让我们增加一点复杂度,并说我们现在需要Place使用多个类别查找所有节点。例如:查找所有Place类别为category的节点,Food或者Bar我们是否仅添加另一条MATCH语句?如果没有,在这里采取的最高效的路线是什么?

另外:
是否有工具可以帮助我描述遍历过程并告诉我最佳选择方法?

贾斯汀帕维拉

如果我正确地理解了您的域,建议您Category将自己设置为节点。

MERGE (:Category {name:"Food"})
MERGE (:Category {name:"Bar"})
MERGE (:Category {name:"Park"})

并将每个Place节点连接Category它所属s。

MERGE (:Place {name:"Central Park"})-[:IS_A]->(:Category {name:"Park"})
MERGE (:Place {name:"Joe's Diner"})-[:IS_A]->(:Category {name:"Food"})
MERGE (:Place {name:"Joe's Diner"})-[:IS_A]->(:Category {name:"Bar"})

然后,如果您要查找Place属于的Category,它可能会很快。首先匹配类别,然后分支到与该类别相关的地方。

MATCH (c:Category {name:"Bar"}), (c)<-[:IS_A]-(p:Place)
RETURN p

您的类别数量相对有限,因此与类别的匹配会很快。然后,由于Neo4j实际存储数据的方式,将很快找到与该类别相关的所有地点。

更复杂

在多个类别中查找位置也很容易。

MATCH (c:Category) WHERE c.name = "Bar" OR c.name = "Food", (c)<-[:IS_A]-(p:Place)
RETURN p

同样,您只需要首先匹配类别(快速,因为没有太多),然后分支到相连的地方。

使用索引

如果需要快速,则需要在有意义的地方使用索引。在此示例中,我将在类别的name属性上使用索引

CREATE INDEX ON :Category(name)

或者更好的是,对类别名称使用唯一性约束,这将为它们建立索引并防止重复。

CREATE CONSTRAINT ON (c:Category) ASSERT c.name IS UNIQUE

索引(和唯一性)对查询速度很大的影响

为什么这是最快的

Neo4j以非常紧凑,易于访问的格式存储节点和关系。一旦有了节点或关系,获取相邻关系或节点的速度就非常快。但是,它分别存储每个节点(和关系)的属性,这意味着浏览属性相对较慢。

目标是尽快到达起始节点。到达那里后,遍历相关实体很快。如果您只有1,000个类别,但您拥有十亿个席位,那么挑选一个个体的速度Category将比挑选一个个体的速度更快Place一旦有了该起始节点,进入相关节点将非常有效。

其他选择

只是为了增强,这就是使您的其他选择变慢或变差的原因。

在第一个示例中,您正在浏览每个节点上的属性以查找匹配项。属性查找很慢,您正在执行十亿次。索引可以帮助解决此问题,但仍然需要大量工作。此外,您正在有效地在十亿个位置中的每个位置上复制类别数据,而没有利用Neo4j的优势。

在所有其他示例中,您的数据模型看起来很奇怪。“食物”,“酒吧”,“公园”等都是类别的实例,而不是单独的类型。它们每个都应该是它们自己的节点,但是它们都应该具有Category标签,因为这就是它们的本质。另外,类别是,因此它们应该是节点。关系描述事物之间联系以这种方式使用类别是没有意义的。

我希望这有帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Python中最有效的睡眠方式是什么?

来自分类Dev

将最高有效设置位以下的所有位归零的最有效方法是什么?

来自分类Dev

在Android的“ ActionBar”中控制“ MenuItem”的最佳方式(最有效或最常规)是什么?

来自分类Dev

一系列0和1的最有效存储方式是什么?

来自分类Dev

将字符串写入文件的最有效方式是什么?

来自分类Dev

一系列0和1的最有效存储方式是什么?

来自分类Dev

以编程方式检查年份是否更改的最有效方法是什么

来自分类Dev

创建具有多个页面的Win窗体的最有效方法是什么?

来自分类常见问题

创建两个熊猫数据框列的字典的最有效方法是什么?

来自分类Dev

在Java中使用axis创建异步请求的最有效方法是什么?

来自分类Dev

在Scala中创建最小堆的最简单,最有效的方法是什么?

来自分类Dev

在Java中创建嵌套div的最有效方法是什么?

来自分类Dev

Rails-创建记录或更新记录(如果记录存在)的最有效方法是什么?

来自分类Dev

创建这个 javascript 和 css 重项目的最有效方法是什么?

来自分类Dev

过滤单个资源最有效的方法是什么?

来自分类Dev

使wifi工作最有效的方法是什么?

来自分类Dev

读取大文件的最有效方法是什么?

来自分类Dev

列出目录的最有效方法是什么?

来自分类Dev

遍历图片像素的最有效方法是什么

来自分类Dev

获取数字总和的最有效方法是什么?

来自分类Dev

在Haxe中循环最有效的方法是什么?

来自分类Dev

使wifi工作最有效的方法是什么?

来自分类Dev

Emacs:删除报价最有效的方法是什么?

来自分类Dev

筛选搜索的最有效方法是什么?

来自分类Dev

检测nmap扫描的最有效方法是什么?

来自分类Dev

绘制网格最有效的方法是什么?

来自分类Dev

Elmah,最有效的错误持久机制是什么?

来自分类Dev

处理 eventListener 的最有效方法是什么?

来自分类Dev

Python:打印列表的最有效方法是什么?

Related 相关文章

  1. 1

    在Python中最有效的睡眠方式是什么?

  2. 2

    将最高有效设置位以下的所有位归零的最有效方法是什么?

  3. 3

    在Android的“ ActionBar”中控制“ MenuItem”的最佳方式(最有效或最常规)是什么?

  4. 4

    一系列0和1的最有效存储方式是什么?

  5. 5

    将字符串写入文件的最有效方式是什么?

  6. 6

    一系列0和1的最有效存储方式是什么?

  7. 7

    以编程方式检查年份是否更改的最有效方法是什么

  8. 8

    创建具有多个页面的Win窗体的最有效方法是什么?

  9. 9

    创建两个熊猫数据框列的字典的最有效方法是什么?

  10. 10

    在Java中使用axis创建异步请求的最有效方法是什么?

  11. 11

    在Scala中创建最小堆的最简单,最有效的方法是什么?

  12. 12

    在Java中创建嵌套div的最有效方法是什么?

  13. 13

    Rails-创建记录或更新记录(如果记录存在)的最有效方法是什么?

  14. 14

    创建这个 javascript 和 css 重项目的最有效方法是什么?

  15. 15

    过滤单个资源最有效的方法是什么?

  16. 16

    使wifi工作最有效的方法是什么?

  17. 17

    读取大文件的最有效方法是什么?

  18. 18

    列出目录的最有效方法是什么?

  19. 19

    遍历图片像素的最有效方法是什么

  20. 20

    获取数字总和的最有效方法是什么?

  21. 21

    在Haxe中循环最有效的方法是什么?

  22. 22

    使wifi工作最有效的方法是什么?

  23. 23

    Emacs:删除报价最有效的方法是什么?

  24. 24

    筛选搜索的最有效方法是什么?

  25. 25

    检测nmap扫描的最有效方法是什么?

  26. 26

    绘制网格最有效的方法是什么?

  27. 27

    Elmah,最有效的错误持久机制是什么?

  28. 28

    处理 eventListener 的最有效方法是什么?

  29. 29

    Python:打印列表的最有效方法是什么?

热门标签

归档