精华内容
下载资源
问答
  • neo4j 关系属性 为了在Neo4j查询中获得最佳的遍历速度,我们应该使关系类型尽可能具体 。 让我们看一下几周前我在Skillsmatter上发表的“ 建模建议引擎建模 ”演讲中的一个例子。 我需要决定如何为成员和事件...

    neo4j 关系属性

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

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

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

    即我们可以选择:

    2015-12-13_20-39-05

    和:

    2015-12-13_20-39-54

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

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

    我们要写什么查询?

    第一个查询将使用以前的“是” 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-节点关系属性存储结构

    千次阅读 2019-05-13 12:06:31
    neo4j-节点关系属性存储结构 1.节点存储 neo4j有一个节点存储文件,用来存储节点的记录,文件名为neostore.nodestore.db 节点记录的长度是固定大小(9字节) 格式为:Node:inUse+nextRelld+nextPropld inUse: 1 表示该...

    neo4j-节点关系属性存储结构

    1.节点存储

    • neo4j有一个节点存储文件,用来存储节点的记录,文件名为neostore.nodestore.db
    • 节点记录的长度是固定大小(9字节)
    • 格式为:Node:inUse+nextRelld+nextPropld在这里插入图片描述
    inUse: 1 表示该节点正常使用, 0 表示该节点被删除
    nextRelId: 该节点的下一个关系 id
    nextPropId:该节点的下一个属性id
    
    可以将存储记录看成是下面的样子
    Node[0,used=true,rel=9,prop=-1]
    Node[1,used=true,rel=1,prop=0]
    Node[2,used=true,rel=2,prop=2]
    Node[3,used=true,rel=2,prop=4]
    Node[4,used=true,rel=4,prop=6]
    
    所以如果我们想要查询id为100的节点,就可以准确的知道该节点记录在存储文件的第900字节,
    基于这种查找方式,数据库可以直接计算出节点的位置,也就是O(1)的效率,
    而不是像关系型数据库O(log(n))的效率
    

    2.关系存储

    • 对应的也有一个关系存储文件,用来存储关系的记录.文件是neostore.relationshipstore.db
    • 长度是固定大小(33字节)
    • 格式为:
      Relationship:inUse+firstNode+secondNode+relType+firstPrevRelId+firstNextRelId+secondPrevRelId+secondNextId+nextProId在这里插入图片描述
    inUse: 1 表示该关系正常使用, 0 表示该关系被删除
    firstNode:当前关系的起始节点
    secondNode:当前关系的终止节点
    relType:关系的类型
    firstPrevRelId & firstNextRelId :起始节点前一个关系和后一个关系的Id
    secondPrevRelId & secondNextId : 终止节点前一个关系和后一个关系的Id
    nextProId: 该关系的下一个属性id
    
    关系记录可以看成下面的方式
    Relationship[0,used=true,source=1,target=0,type=0,sPrev=1,sNext=-1,tPrev=3,tNext=-1,prop=1]
    Relationship[1,used=true,source=2,target=1,type=1,sPrev=2,sNext=-1,tPrev=-1,tNext=0,prop=3]
    Relationship[2,used=true,source=3,target=2,type=2,sPrev=-1,sNext=-1,tPrev=-1,tNext=1,prop=5]
    

    3.属性存储

    • 属性记录的物理存放位置是neostore.propertystore.db
    • 属性的存储也是固定长度(不过不用担心长度不够,长度不够的时候会去申请动态存储)
    • 每个属性记录包含4个属性块和属性链中下一个属性的id.属性链是单向链表,关系链是双向链表
    • neo4j是基于java开发,所以一个属性记录中可以包含任何java虚拟机(JVM)支持的基本数据类型/字符串/数组/属性索引文件(neostore.propertystore.db.index).
    • 属性索引文件主要用于存储属性的名称,属性索引的值部分存储的是指向动态内存的记录(长度不够存储的时候会去申请动态内存,并放在动态存储文件中)或内联值.在这里插入图片描述
    inUse: 1 代表正常使用的属性, 0 已经删除的属性
    keyindexId:属性id
    nextProId:下一个属性的id , 单向链表
    propBlock:存储长度 29-5 = 24 个字节长度
    

    4.补充:动态存储分类

    • 动态存储,是属性存储长度不足时需要用到的存储文件
    • 分类:1.动态字符串存储 2.动态数组存储
    • 如果一条数据长到一个动态存储仍无法完全容纳时,可以申请多个动态存储记录逻辑上进行连接

    5.总结

    • Neo4j数据库有一个.id文件保持对未使用记录的跟踪,用来回收未使用记录占用的空间,节点和关系存储文件只关心图的基本存储结构而不是属性数据,这两种记录都是固定大小,从而达到高性能遍历的关键设计决策.几点记录和关系记录都是相当轻量级的,由指向联系和属性列表的指针构成
    • 一个节点的所有属性被记录到一个单向链表上面.只有指向下一个属性的指针,没有指向上一个属性的指针
    • 两个节点之间的所有关系被记录到一个双向链表上面,既有指向上一个关系的指针,也有指向下一个关系的指针在这里插入图片描述
    • 节点存储文件和关系存储文件都是固定长度,只关心结构,不关心属性数据,属性存储文件也是固定长度,只关心数据,不关心结构.当长度不足时,会去申请动态存储,将超出的数据长度存放在动态存储里面,并将地址存放在属性存储文件中.查找的时候进行拼接

    参考:

    https://www.jianshu.com/p/26fea16888ec
    http://www.cnblogs.com/bonelee/p/6211290.html
    https://blog.csdn.net/huaishu/article/details/11713753

    展开全文
  • neo4j中修改添加关系或者节点的属性

    千次阅读 2020-04-01 15:11:20
    neo4j中提供set操作,可以实现这一功能 例如: 给尾部这一关系添加title...需要注意 该句会重置关系的属性,原有的关系属性会被删除掉。 若是修改属性的名称,使用下面的语句: set r.有尾部=r.尾部 remove r.尾部 ...

    neo4j中提供set操作,可以实现这一功能
    例如:
    给尾部这一关系添加title这一属性
    MATCH p=()-[r:尾部]->() SET r={title:“尾部”} RETURN p
    需要注意 该句会重置关系的属性,原有的关系属性会被删除掉。

    若是修改属性的名称,使用下面的语句:
    set r.有尾部=r.尾部
    remove r.尾部

    展开全文
  • 在E / R图中,关系是否具有属性? 在ER模型中,实体具有可以是各种类型的属性,如单值,多值,复合,简单,存储,派生和复杂。但是关系也可以具有与之相关的属性。通常,如果不需要,不建议为关系提供属性,因为在...

    在E / R图中,关系是否具有属性?

    在ER模型中,实体具有可以是各种类型的属性,如单值,多值,复合,简单,存储,派生和复杂。但是关系也可以具有与之相关的属性。通常,如果不需要,不建议为关系提供属性,因为在将ER模型转换为关系模型时,事情可能会变得复杂,我们可能需要创建一个单独的表来表示关系。让我们看看各种情况,以及何时需要借助示例为关系赋予属性:

    1.一对一关系:


    在一个组织中,员工管理一个部门,每个部门由一些员工管理。因此,em> Department实体全部参与,并且给定实体之间存在一对一的关系。现在,如果我们想要存储员工开始管理部门的Start_Date,那么我们可能会认为我们可以将Start_Date属性赋予关系管理。但是,在这种情况下,我们可以通过将Start_Date属性与EmployeeDepartment实体相关联来避免它。

    假如有n个一对一关系,也就是有n个数据对象需要存储(寄生),这时候正好有n个员工和n个部门,所以2个反向都可以寄生。

    2.一对多关系:


    在一个组织中,许多员工可以为一个部门工作,但每个员工只能在一个部门工作。因此,实体之间存在一对多的关系。现在,如果我们想在员工开始为部门工作时存储Start_Date,那么我们应该将其分配给Employee实体,而不是将其分配给关系。将其分配给员工实体是有道理的,因为每个员工只能为单个部门工作,但另一方面,一个部门可以让很多员工在其下工作,因此,如果我们将Start_Date属性分配给Department,则没有意义。

    这时候,假设有n个员工,则有n个一对多关系需要寄生,而部门的数量<n,所以只能将start date数据存在n个员工身上。


     

    3.多对多的关系:


    在一个组织中,员工可以同时处理许多项目,每个项目都可以让很多员工参与其中。因此,这是一个多对多的关系。因此,将Number_of_Working_hours分配给员工将无法工作,因为问题是它将存储哪个项目的工作时间,因为单个员工可以处理多个项目。与项目实体的情况类似。因此,我们被迫将Number_of_Working_hours属性分配给关系。

    这时候,假设有m个员工和n个项目,关系数最多的情况是两两都有关系,即总关系数为m*n,但是现在总共能存储的位置只有m+n个,根本不够存放,所以两边都不能移动。

     

    结论:仅在多对多关系的情况下为关系提供属性。

    实例(多对多)

    如果两个实体之间的关系是多对多,我们将需要一个额外的关系表,新表应该至少有两个属性(外键)来自每个表(它们各自的主键)。但是,我们可以根据要捕获的数据的需求和深度添加更多属性。

    让我们举两个实体玩家游戏的例子。

    场景:许多玩家玩很多游戏

    这两个表之间的关联将是多对多的。表格player仅包含player详细信息(PlayerID,Name,...),表格game仅包含游戏详细信息(GameID,Name,Venue,...)。

    要知道哪个玩家玩哪个游戏以及何时玩,我们构建一个新表(Plays),其中包含来自任一表的属性。

    还要注意的是PlayerID播放是一个外键和引用玩家表。游戏ID播放是一个外键和引用的游戏表。但是,GameIDPlayerID的组合在Plays表中形成一个复合主键

     

    注意:该图是使用ERDPlus创建的

    如果多对多关系没有属性

    那么就不用第三张表,可以利用json列表来存放这种关系。

    展开全文
  • 知识图谱属性关系区别

    千次阅读 2020-04-06 21:18:30
    知识图谱中属性关系的区别主要是在于其面对的实体不同。 实体关系分为两种,一种是属性property,一种是关系relation。其最大区别在于,属性所在的三元组对应的两个实体,常常是一个topic和一个字符串,如属性Type...
  • 关系与导航属性

    万次阅读 2014-05-13 13:56:44
    关系、导航属性和外键 在关系数据库中,表之间的关系(也称为关联)是通过外键定义的。外键 (FK) 是用于在两个表的数据之间建立并强制链接的一列或列组合。有三种关系类型:一对一、一对多和多对多。在一对多关系中...
  • UML类图属性和相关关系

    千次阅读 2019-07-21 15:02:48
    1. 类属性的可见性 描述类的属性的可见性: UML中,可见性分为4级 public 公用的 :用+ 前缀表示 ,该属性对所有类可见 protected 受保护的:用 # 前缀表示,对该类的子孙可见 private 私有的:用- 前缀表示,...
  •  显然按照题目的意思并不能直接将关系salaried_worker的属性name和关系hourly_worker的属性name都定义为关系address的外键(foreign key)。因为我们只希望要求每个出现在address中的名字必须出现在salaried_worker...
  • EF CodeFirst 关系与导航属性

    千次阅读 2014-10-16 22:29:21
    实体框架关系与导航属性 http://msdn.microsoft.com/zh-cn/data/jj713564 EF Code First 学习笔记关系 - Gyoung - 博客园 http://www.cnblogs.com/Gyoung/archive/2013/01/22/2869782.html Entity ...
  • 数据库之关系数据库之超码,候选码,主码,主属性,非主属性(非码元素)之间的关系 超码(Super Key): 在关系模型中能唯一标识一个元组的属性集称为关系模式的超码。 候选码(Candidate Key): 不含多余属性的...
  • echarts关系图各属性讲解

    千次阅读 2020-05-25 18:40:14
    大佬要求前端页面用echarts做一个关系图,然后摸索了一下,搞清楚了各个属性的具体含义及用法,才把图给写出来,记录一下我用到过的各个属性 this.myChart.setOption( { //表的显示名称 title: { text: '数据...
  • 在写入图谱前先要有相关的标准库。然后就是python简单的判断+cypher语句的...人名的关系中,来补全公司属性和人物属性。 dat = session.run("MATCH (m:COMPANY)-[]->(n:PERSON) RETURN m.name as me, m.cid as ...
  • E-R图 实体,属性关系

    千次阅读 2020-07-03 18:18:07
    E-R图 实体,属性关系图 在ER图中有如下四个成分: 矩形框:表示实体,在框中记入实体名。 菱形框:表示联系,在框中记入联系名。 椭圆形框:表示实体或联系的属性,将属性名记入框中。对于主属性名,则在其...
  • py2neo 给关系增加属性

    千次阅读 2019-11-28 17:50:15
    在用neo4j的时候,可能有一条边有多个属性,这个时候怎么用py2neo来添加呢,这里给我我的例子: node1 = Node('person', per_name='Alice_1') node2 = Node('person', per_name='Bob_1') properties={'date':'2019...
  • 将具有多值属性的实体映射为关系数据库组件 我们在第2章中曾提到,多值属性适用于同一个实体的某一个属性具有多个取值的情况。一个包含多值属性的实体将被映射为不含多值属性关系。多值属性将被映射为一个单独的...
  • 关系中的某一属性属性组的值能唯一的标识一个元组,而其任何、子集都不能再标识,则称该属性组为(超级码)候选码。 例如:在学生实体中,“学号”是能唯一的区分学生实体的,同时又假设“姓名”、“班级”的...
  • 候选码:关系中的一个属性或者属性组,能够唯一标识一个元组,且它的真子集不能唯一标识元组。 主码:从所有候选码中选择一个,作为主码。例如:学生关系(学号,身份证号,姓名,院系,专业,性别 ,生日),有两个...
  • neo4j的关系节点如何添加属性信息

    千次阅读 2020-02-28 15:21:25
    如果可以成功匹配到该关系节点,那么就可以使用一下语句添加属性信息了 然后使用以下类似语句: MATCH p=()-[r:`尾部`]->() SET r={title:"尾部"} RETURN p MATCH p=()-[r:`尾部`]->() SET r={title:"尾部"} ...
  • 关系、导航属性和外键 在关系数据库中,表之间的关系(也称为关联)是通过外键定义的。外键 (FK) 是用于在两个表的数据之间建立并强制链接的一列或列组合。有三种关系类型:一对一、一对多和多对多。在一对多关系...
  • 今天用EF做更新操作时,抛出了System.InvalidOperationException:“操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null。对关系作出更改后,会将相关的外键属性设置为 null 值。如果外键不支持 null 值,...
  • 在继承关系中子类可以继承父类的那些属性和方法 在继承关系中,子类可以继承父类的public 属性和方法,可以继承protected属性和方法,如果子类和父类在同一个包中,则父类默认访问修饰符属性和方法也是可以被子类...
  • 数据库:码 属性 候选码 主码的关系 定义 码 唯一标识实体的属性集称为码。例如学号是学生实体的码 属性 实体所具有的某一特性称为属性 候选码 设K为R<U,F>中的属性属性组合,若K→U,则K为R的候选码 ...
  • 双向一对多外联关系-XML配置属性

    千次阅读 2016-01-26 10:08:36
    双向一对多外联关系-XML配置属性
  • powerdesigner建er图的时候关系属性应该怎么表示啊 网上查了好久都没查到 有没有人知道啊给个解决方法也行啊
  • vs 中在一个项目上我们可以通过项目的属性页来修改相关属性,也可以通过修改属性管理器中的相关内容来修改相关属性, 在新建某一类工程时,总是会有配置问题,
  • CREATE用来创建节点,关系属性,例子如下: CREATE ( { }) -[ { }]-> ( { }), 可以以逗号隔开。 查询是用MATCH进行匹配(包括单纯节点,或者有关系链条),然后RETURN 自己需要的东西。 MATCH (n:人物{name:...
  • 文件位置: D:\phpStudy\... 隐藏属性: protected $hidden = ['password']; 显示属性: protected $visible = ['first_nam...
  • Navicat查看数据所有表属性和ER关系图 一、查看所有表属性 使用场景:在没有文档的情况下,查看所有表名是做什么的时候,很不方便。 解决方式:需要知道每个表对应系统的功能作用操作如下 1、链接数据库,点击表...
  • 1、属性  对应表中的列 2、域  列的取值范围(相同数据类型的值的集合) 3、元组  表中的行即为元组 ... 关系有3个属性:a、关系名(表名) b、属性列表及值域(列) c、属性间的数据依赖
  • 为什么数据库中同一个关系表中的属性名是不能重名的,不同的关系表中的属性名是可以重?能举个例子吗?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,343,100
精华内容 537,240
关键字:

关系属性