neo4j 关系属性

为了在Neo4j查询中获得最佳的遍历速度,我们应该使关系类型尽可能具体

让我们看一下几周前我在Skillsmatter上发表的“ 建模建议引擎建模 ”演讲中的一个例子。

我需要决定如何为成员事件之间的“ RSVP”关系建模。 一个人可以对某个事件表示“是”或“否”,我想同时捕获这两个响应。

即我们可以选择:

和:

在确定模型时,我们主要需要考虑我们要编写的查询的类型。 我们不应该忘记更新模型,但以我的经验,查询图形要比更新图形花费更多的时间。

让我们依次看一下其中的每个:

我们要写什么查询?

第一个查询将使用以前的“是” RSVP作为将来事件的关注指标。 我们对此查询的“否” RSVP不感兴趣。

我从具有“ response”属性的通用RSVP关系类型开始,以区分“是”和“否”:

MATCH (member:Member {name: "Mark Needham"})
MATCH (futureEvent:Event) WHERE futureEvent.time >= timestamp()
MATCH (futureEvent)<-[:HOSTED_EVENT]-(group)OPTIONAL MATCH (member)-[rsvp:RSVPD {response: "yes"}]->(pastEvent)<-[:HOSTED_EVENT]-(group)
WHERE pastEvent.time < timestamp()RETURN group.name, futureEvent.name, COUNT(rsvp) AS previousEvents
ORDER BY  previousEvents DESC

这运行得相当快,但是我很好奇是否可以通过更改为更具体的模型来使查询更快地运行。 使用更具体的关系类型,我们的查询显示为:

MATCH (member:Member {name: "Mark Needham"})
MATCH (futureEvent:Event) WHERE futureEvent.time >= timestamp()
MATCH (futureEvent)<-[:HOSTED_EVENT]-(group)OPTIONAL MATCH (member)-[rsvp:RSVP_YES]->(pastEvent)<-[:HOSTED_EVENT]-(group)
WHERE pastEvent.time < timestamp()RETURN group.name, futureEvent.name, COUNT(rsvp) AS previousEvents
ORDER BY  previousEvents DESC

现在,我们可以分析查询并比较两种解决方案的数据库命中率:

RSVPD {response: "yes"}
Cypher version: CYPHER 2.3, planner: COST. 688635 total db hits in 232 ms.RSVP_YES
Cypher version: CYPHER 2.3, planner: COST. 559866 total db hits in 207 ms.

因此,通过使用更具体的关系类型,我们会获得一点收益。 数据库命中率较低的原因部分是因为我们不再需要在每个“ RSVP”属性上查找“ response”属性并检查其是否与“ yes”匹配。 我们还评估了较少的关系,因为我们只查看正向RSVP,负向被忽略。

我们的下一个查询可能是捕获成员发出的所有RSVP,并在事件旁边列出它们:

MATCH (member:Member {name: "Mark Needham"})-[rsvp:RSVPD]->(event)
WHERE event.time < timestamp()
RETURN event.name, event.time, rsvp.response
ORDER BY event.time DESC
MATCH (member:Member {name: "Mark Needham"})-[rsvp:RSVP_YES|:RSVP_NO]->(event)
WHERE event.time < timestamp()
RETURN event.name, event.time, CASE TYPE(rsvp) WHEN "RSVP_YES" THEN "yes" ELSE "no" END AS response
ORDER BY event.time DESC

再次,我们看到边际数据库命中率赢得了更具体的关系类型:

RSVPD {response: "yes"} / RSVPD {response: "no"}
Cypher version: CYPHER 2.3, planner: COST. 684 total db hits in 37 ms.RSVP_YES / RSVP_NO
Cypher version: CYPHER 2.3, planner: COST. 541 total db hits in 24 ms.

但是,查询非常麻烦,除非我们将响应存储为关系的属性,否则返回“ yes”或“ no”的代码会有些尴尬。 如果引入了我们选择排除的“ waitlist” RSVP,则更具体的方法查询将变得更加痛苦。

我们需要更新关系吗?

是! 在事件发生之前,用户可以更改其RSVP,因此我们需要能够进行处理。

让我们看一下使用两种模型处理RSVP更改时必须编写的查询:

通用关系类型

MATCH (event:Event {id: {event_id}})
MATCH (member:Member {id: {member_id}})
MERGE (member)-[rsvpRel:RSVPD {id: {rsvp_id}}]->(event)
ON CREATE SET rsvpRel.created = toint({mtime})
ON MATCH  SET rsvpRel.lastModified = toint({mtime})
SET rsvpRel.response = {response}

具体关系类型

MATCH (event:Event {id: {event_id}})
MATCH (member:Member {id: {member_id}})FOREACH(ignoreMe IN CASE WHEN {response} = "yes" THEN [1] ELSE [] END |MERGE (member)-[rsvpYes:RSVP_YES {id: {rsvp_id}}]->(event)ON CREATE SET rsvpYes.created = toint({mtime})ON MATCH  SET rsvpYes.lastModified = toint({mtime})MERGE (member)-[oldRSVP:RSVP_NO]->(event)DELETE oldRSVP
)FOREACH(ignoreMe IN CASE WHEN {response} = "no" THEN [1] ELSE [] END |MERGE (member)-[rsvpNo:RSVP_NO {id: {rsvp_id}}]->(event)ON CREATE SET rsvpNo.created = toint({mtime})ON MATCH  SET rsvpNo.lastModified = toint({mtime})MERGE (member)-[oldRSVP:RSVP_YES]->(event)DELETE oldRSVP
)

如您所见,使用特定的关系类型时,更新RSVP的代码更加复杂,部分原因是Cypher还没有对条件的一流支持。

总而言之,对于我们的metup.com模型,我们通过使用更具体的关系类型获得了速度上的提高,但是却以一些更复杂的读取查询和更为复杂的更新查询为代价。

根据模型中关系的基数,您的里程可能会有所不同,但是值得进行一些分析以比较所有选项。

翻译自: https://www.javacodegeeks.com/2015/12/neo4j-specific-relationship-vs-generic-relationship-property.html

neo4j 关系属性

neo4j 关系属性_Neo4j:特定关系与一般关系+属性相关推荐

  1. neo4j模糊查询_Neo4j:通用/模糊关系名称

    neo4j模糊查询 我与Neo4j用户一起工作时经常看到的一种建模方法是创建非常通用的关系(例如HAS,CONTAINS,IS),并在关系属性或端节点的属性/标签上进行过滤. 直观上,这似乎并未充分利 ...

  2. py2neo的neo4j数据库增删改查节点node、关系relationship、属性property操作

    py2neo的neo4j数据库增删改查节点node.关系relationship.属性property操作 py2neo版本为4.3.0 设置节点和关系: # neo4j默认密码是neo4j,如有修改 ...

  3. neo4j的使用(以红楼梦人物关系为例)

    参考:知识图谱实战:构建红楼梦知识图谱_任萌新的小生活-CSDN博客_知识图谱构建实战https://blog.csdn.net/RHJlife/article/details/108586578 先 ...

  4. 学校(School)主要有3大角色:学校(School),讲师(Teacher),学员(Student)。请用Python语言简要实现这些类及及其属性,以及它们之间的关系。

    学校(School)主要有3大角色:学校(School),讲师(Teacher),学员(Student). 学校可以注册学员,统计有多少学员 讲师负责讲课 学生听课,提问,学习,交学费 Teacher ...

  5. intent隐式和显式_Neo4j:使隐式关系成为显式和双向关系

    intent隐式和显式 我最近阅读了Michal Bachman关于 Neo4j中双向关系的文章 ,他建议对于某些关系类型,我们对关系的方向不那么感兴趣,因此可以在查询时忽略它. 他使用以下示例显示N ...

  6. mysql里面的选择运算_在MySQL关系模型中,选择运算是在一个关系的所有元组中选择指定属性列,组成新关系。...

    [单选题]下列关于元素第一电离能的说法不正确的是( ) [填空题]We had already ____ contact with the museum. [判断题]DELETE语句功能是对表中所有记 ...

  7. mybatis解决字段和属性的映射关系3 - 通过resultMap设置自定义映射关系

    本节我们将探索mybatis解决字段和属性的映射关系3 - 通过resultMap设置自定义映射关系 目录 1.接口和pojo实体类 2.mapper映射文件 2.1 resultMap 2.2 re ...

  8. 【论文分享】通过图神经网络明确捕捉实体提及的关系,用于特定领域的命名实体识别

    [ACL 2021] Explicitly Capturing Relations between Entity Mentions via Graph Neural Networks for Doma ...

  9. 数学与神经网络关系大吗,神经网络与算法的关系

    关于遗传算法,模糊数学,神经网络三种数学的区别和联系 遗传算法是一种智能计算方法,针对不同的实际问题可以设计不同的计算程序.它主要有复制,交叉,变异三部分完成,是仿照生物进化过程来进行计算方法的设计. ...

  10. 【梳理】数据库系统概论 第2章 关系数据库 2.1 关系数据结构及其形式化定义 2.2 关系操作 2.3 关系的完整性

    教材:王珊 萨师煊 编著 数据库系统概论(第5版) 高等教育出版社 注:文档高清截图在后 第2章 关系数据库 2.1 关系数据结构及其形式化定义 1.关系数据库系统是支持关系模型的数据库系统.关系模型 ...

最新文章

  1. 哪个瞬间让你突然觉得CV技术真有用?
  2. 开始写博客,毕业一年的收获
  3. Failed to bind NettyServer on /192.168.**.*:20880, cause: Failed to bind to: /0.0.0.0:20880
  4. 百度关闭新闻源背后的13个趋势风口
  5. Ubuntu 12.04(64位)下载并编译 Android 4.1 源码[只有2条命令]
  6. leetcode 148. Sort List | 148. 排序链表(最优解归并排序,O(1)空间)
  7. 机器学习从入门到精通50讲(一)-大数据平台下的数据质量管理
  8. HTTPS加密解密过程
  9. 将16进制unsigned char数组转换成整数
  10. DatabaseDesign数据库设计
  11. Xocde一次版本升级遇到的问题 (Code Sign Error)
  12. 用matlab如何求导,matlab如何求导 matlab求导 matlab如何求导
  13. 计算机硬件故障的相关知识,电脑常见硬件故障大全
  14. C UDR 的内存分配
  15. 什么是深拷贝与浅拷贝
  16. 2020年6月六级作文和翻译三国演义
  17. 根本不赚钱,你为何还坚持写博客?
  18. struts2优点总结
  19. Centos 大于4TB 硬盘LVM 水平扩容
  20. 深度学习训练时GPU利用率忽高忽低问题

热门文章

  1. P5180-[模板]支配树
  2. YbtOJ#763-攻城略池【线段树合并】
  3. 初一模拟赛总结(6.6 my brother高考前一天,加油!(。・`ω´・。))
  4. 17、mysql中的存储过程的应用
  5. 并发场景下MySQL存在的问题及解决思路
  6. 输入框限定保留三位小数点
  7. 压力与动力是否成正比?
  8. JS中对象创建的五中方式
  9. 2017蓝桥杯省赛---java---B---2(纸牌三角形)
  10. zookeeper 屁民