neo4j模糊查询

我与Neo4j用户一起工作时经常看到的一种建模方法是创建非常通用的关系(例如HAS,CONTAINS,IS),并在关系属性或端节点的属性/标签上进行过滤。

直观上,这似乎并未充分利用图模型,因为这意味着您必须评估许多您不感兴趣的关系和节点。

但是,我从未真正测试过这两种方法之间的性能差异,因此我想尝试一下。

我创建了4个不同的数据库,它们的一个节点具有60,000个传出关系– 10,000个我们要检索的关系和50,000个不相关的关系。

我以4种不同的方式对“关系”进行建模……

  • 使用特定的关系类型
    (节点)-[:HAS_ADDRESS]->(地址)
  • 使用通用关系类型,然后按最终节点标签过滤
    (节点)-[:HAS]->(地址:地址)
  • 使用通用关系类型,然后按关系属性进行过滤
    (节点)-[:HAS {类型:“地址”}]->(地址)
  • 使用通用关系类型,然后按终端节点属性进行过滤
    (节点)-[:HAS]->(地址{type:“地址”})

…然后测量了检索“具有地址”关系所花费的时间。

  • 如果您想看一下, 代码在github上 。

尽管它显然不如JMH微型基准测试精确,但我认为足以感觉到这两种方法之间的差异。

我对每个数据库运行了100次查询,然后分别执行了第50、75和99个百分位数(时间以毫秒为单位):

Using a generic relationship type and then filtering by end node label
50%ile: 6.0    75%ile: 6.0    99%ile: 402.60999999999825Using a generic relationship type and then filtering by relationship property
50%ile: 21.0   75%ile: 22.0   99%ile: 504.85999999999785Using a generic relationship type and then filtering by end node label
50%ile: 4.0    75%ile: 4.0    99%ile: 145.65999999999931Using a specific relationship type
50%ile: 0.0    75%ile: 1.0    99%ile: 25.749999999999872

我们可以通过分析等效的密码查询来进一步探究每种方法的时间为何不同。 我们将从使用特定关系名称的那一个开始:

使用特定的关系类型

neo4j-sh (?)$ profile match (n) where id(n) = 0 match (n)-[:HAS_ADDRESS]->() return count(n);
+----------+
| count(n) |
+----------+
| 10000    |
+----------+
1 rowColumnFilter|+EagerAggregation|+SimplePatternMatcher|+NodeByIdOrEmpty+----------------------+-------+--------+-----------------------------+-----------------------+
|             Operator |  Rows | DbHits |                 Identifiers |                 Other |
+----------------------+-------+--------+-----------------------------+-----------------------+
|         ColumnFilter |     1 |      0 |                             | keep columns count(n) |
|     EagerAggregation |     1 |      0 |                             |                       |
| SimplePatternMatcher | 10000 |  10000 | n,   UNNAMED53,   UNNAMED35 |                       |
|      NodeByIdOrEmpty |     1 |      1 |                        n, n |          {  AUTOINT0} |
+----------------------+-------+--------+-----------------------------+-----------------------+Total database accesses: 10001

在这里,我们可以看到有10002次数据库访问,以便获得10,000个HAS_ADDRESS关系的计数。 每次加载节点,关系或属性时,我们都会获得数据库访问权限。

相比之下,其他方法只需要加载更多数据然后进行过滤即可:

使用通用关系类型,然后按最终节点标签过滤

neo4j-sh (?)$ profile match (n) where id(n) = 0 match (n)-[:HAS]->(:Address) return count(n);
+----------+
| count(n) |
+----------+
| 10000    |
+----------+
1 rowColumnFilter|+EagerAggregation|+Filter|+SimplePatternMatcher|+NodeByIdOrEmpty+----------------------+-------+--------+-----------------------------+----------------------------------+
|             Operator |  Rows | DbHits |                 Identifiers |                            Other |
+----------------------+-------+--------+-----------------------------+----------------------------------+
|         ColumnFilter |     1 |      0 |                             |            keep columns count(n) |
|     EagerAggregation |     1 |      0 |                             |                                  |
|               Filter | 10000 |  10000 |                             | hasLabel(  UNNAMED45:Address(0)) |
| SimplePatternMatcher | 10000 |  60000 | n,   UNNAMED45,   UNNAMED35 |                                  |
|      NodeByIdOrEmpty |     1 |      1 |                        n, n |                     {  AUTOINT0} |
+----------------------+-------+--------+-----------------------------+----------------------------------+Total database accesses: 70001

使用通用关系类型,然后按关系属性进行过滤

neo4j-sh (?)$ profile match (n) where id(n) = 0 match (n)-[:HAS {type: "address"}]->() return count(n);
+----------+
| count(n) |
+----------+
| 10000    |
+----------+
1 rowColumnFilter|+EagerAggregation|+Filter|+SimplePatternMatcher|+NodeByIdOrEmpty+----------------------+-------+--------+-----------------------------+--------------------------------------------------+
|             Operator |  Rows | DbHits |                 Identifiers |                                            Other |
+----------------------+-------+--------+-----------------------------+--------------------------------------------------+
|         ColumnFilter |     1 |      0 |                             |                            keep columns count(n) |
|     EagerAggregation |     1 |      0 |                             |                                                  |
|               Filter | 10000 |  20000 |                             | Property(  UNNAMED35,type(0)) == {  AUTOSTRING1} |
| SimplePatternMatcher | 10000 | 120000 | n,   UNNAMED63,   UNNAMED35 |                                                  |
|      NodeByIdOrEmpty |     1 |      1 |                        n, n |                                     {  AUTOINT0} |
+----------------------+-------+--------+-----------------------------+--------------------------------------------------+Total database accesses: 140001

使用通用关系类型,然后按终端节点属性进行过滤

neo4j-sh (?)$ profile match (n) where id(n) = 0 match (n)-[:HAS]->({type: "address"}) return count(n);
+----------+
| count(n) |
+----------+
| 10000    |
+----------+
1 rowColumnFilter|+EagerAggregation|+Filter|+SimplePatternMatcher|+NodeByIdOrEmpty+----------------------+-------+--------+-----------------------------+--------------------------------------------------+
|             Operator |  Rows | DbHits |                 Identifiers |                                            Other |
+----------------------+-------+--------+-----------------------------+--------------------------------------------------+
|         ColumnFilter |     1 |      0 |                             |                            keep columns count(n) |
|     EagerAggregation |     1 |      0 |                             |                                                  |
|               Filter | 10000 |  20000 |                             | Property(  UNNAMED45,type(0)) == {  AUTOSTRING1} |
| SimplePatternMatcher | 10000 | 120000 | n,   UNNAMED45,   UNNAMED35 |                                                  |
|      NodeByIdOrEmpty |     1 |      1 |                        n, n |                                     {  AUTOINT0} |
+----------------------+-------+--------+-----------------------------+--------------------------------------------------+Total database accesses: 140001

因此,总而言之……特定的关系#ftw!

翻译自: https://www.javacodegeeks.com/2014/10/neo4j-genericvague-relationship-names.html

neo4j模糊查询

neo4j模糊查询_Neo4j:通用/模糊关系名称相关推荐

  1. mysql模糊查询 or_mysql的模糊查询

    mysql模糊查询like/REGEXP (1)like / not like MySql的like语句中的通配符:百分号.下划线和escape %:表示任意个或多个字符.可匹配任意类型和长度的字符. ...

  2. 模糊查询银行卡号mysql_mysql模糊查询

    实例: SQL模糊查询,使用like比较关键字,加上SQL里的通配符,请参考以下: 1.LIKE'Mc%' 将搜索以字母 Mc 开头的所有字符串(如 McBadden). 2.LIKE'%inger' ...

  3. oracle 模糊查询_MySQL Like模糊查询速度太慢如何解决

    问题:明明建立了索引,为何Like模糊查询速度还是特别慢? Like是否使用索引? 1.like %keyword 索引失效,使用全表扫描.但可以通过翻转函数+like前模糊查询+建立翻转函数索引=走 ...

  4. mysql 模糊查询 s_MySql反向模糊查询

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/yangfengjueqi/articl ...

  5. java模糊查询代码_Java模糊查询方法详解

    这篇文章主要为大家详细介绍了Java模糊查询方法的实现,实例教你如何用Java做模糊查询结果,感兴趣的小伙伴们可以参考一下 当我们需要开发一个方法用来查询数据库的时候,往往会遇到这样一个问题:就是不知 ...

  6. cad模糊查询符号_SQL 模糊查询之特殊字符

    1. SQL Like对时间查询 时间格式的数据为各种各样,不方便查询.在使用like模糊查询时,先将数据转换为统一的格式,这样在使用like查询时就方便多了. 2. SQL like对特殊字符 在s ...

  7. cad模糊查询符号_模糊查询(排除%等通配符并支持不连续关键字查询)

    前段时间我在开发项目的时候,就关于模糊查询遇到了一点问题,主要是有两大问题:1.通配符问题:2.不连续关键字查询.下面我一一说出我是怎么解决的: 1.统配符问题 比如说在搜索框中输入'%'.'_'.' ...

  8. html 下拉列表 模糊查询,JS实现模糊查询带下拉匹配效果

    "搜索"可以使我们更快的找到某一个关键词或者某一个商品,所以"模糊查询"和"下拉匹配"也成了前端必备的一个小技能,开门见山,希望对朋友们有帮 ...

  9. mysql mapper配置模糊查询_Mybatis各种模糊查询

    模糊查询: 工作中用到,写三种用法吧,第四种为大小写匹配查询 1. sql中字符串拼接 SELECT * FROM tableName WHERE name LIKE CONCAT(CONCAT('% ...

最新文章

  1. php递归面包屑,php可应用于面包屑导航的递归寻找家谱树实现方法
  2. Python基础之:Python中的IO
  3. “Linaro”将推动开源软件新一波开发潮
  4. maven的标准pom.xml详解
  5. 测试经理管理团队应注意的点
  6. 第三届蓝桥杯决赛c++b组
  7. 利用python进行数据分析(第二版)_第六章
  8. html的滚动条样式,css滚动条样式
  9. 给小朋友讲故事——第一次世界大战(音频)
  10. 聚合供应链,Saas系统,商品供应链
  11. Ubuntu16.04开启SSH服务
  12. oracle rfs进程过多,oracle 11.2 DataGuard少了日志应用进程RFS
  13. 去掉CAJViewer广告的方法
  14. oracle灾备同步_【oracle灾备方案系列】基于DDS的Oracle复制容灾方案(三)
  15. 15道HTML5基础面试题(附答案)
  16. Gradle本地化构建技巧之自定义Gradle配置文件
  17. 最小编辑距离 动态规划 python
  18. C语言中变量的作用域和生命周期
  19. JS将对象数组按指定顺序排列
  20. python- FTP 实现上传文件到服务器

热门文章

  1. Kotlin - 静态方法
  2. 我是怎么找到第一份实习的
  3. 【详细】芯片设计全流程(包括每个流程需要用到的工具以及需要参与的工作人员)
  4. 数据结构课程设计:约瑟夫生者死者游戏(c++实现、单循环链表、输出死者姓名和编号、附可执行源代码)
  5. 数值分析 | 多项式求值(Horner法则)
  6. 机器学习-学习曲线-sklearn
  7. 【STM32】STM32 SDIO SD卡读写测试(四)-- SD_Test之Transfer Mode阶段
  8. 苹果香港官方预定iphone网址
  9. 为Linux 初学者选择发行版本支招
  10. Eureka 一直刷 Running the evict task with compensationTime 0ms