【问题标题】:Converting a sample relational data model to graph data model将示例关系数据模型转换为图形数据模型
【发布时间】:2018-03-28 00:19:52
【问题描述】:

我设计了一个关系数据模型,它是图形数据模型。 我想知道我是否以正确的方式完成了它,以及我的图形数据模型是否正确。如果我的模型有任何问题或模棱两可,请发表评论。

正如您在图形数据模型中看到的那样,有 4 个标签:

  1. 公司
  2. 用户
  3. 技能
  4. 项目

您可以看到每个带有标签的节点都有它的属性,并且连接表被转换为节点之间的关系。 我想知道我应该如何处理userIDSkillID 等“主键”。

关系数据模型:

图形数据模型:

【问题讨论】:

  • 什么是“用户”?
  • 一个用户就是一个人。我想我为实体选择了错误的名称。用户我的意思是一个人。我认为“人”是一个更好的替代品
  • 嗨@PTTT。您的第一个问题可能会产生基于意见的答案。 StackOverflow 不鼓励这种问题。但是,您的数据模型乍一看还不错。但是请记住,在对图形数据库进行建模时,一个好的做法是根据您的查询要求制作模型。因此,在开始建模之前,请考虑您想要询问数据库的查询。我已经回答了你关于主键的问题,请看一下。
  • @PTTT 还有,看看herehere
  • 谢谢。事实上,我正在做一个关于图形数据库的演讲。我想向观众展示一个关系数据模型并运行一些 sql 查询,然后向他们展示图形数据模型和相同的 cql 查询。实际上,我尽了最大努力使我的关系模型独一无二。我不想向他们展示已经存在的示例。所以我试着为自己做一个例子,然后我使用了一些连接表,这样我就可以使用连接进行 sql 查询,然后将等效的 cql 与 sql 查询进行比较。您认为这是一个展示图数据库优势的好例子吗?

标签: sql-server neo4j relational-database data-modeling graph-databases


【解决方案1】:

关于主键问题:

事实上,Neo4j 节点和关系有一个内部唯一 ID,可以使用 id() 函数访问:

match (d)-[r]-()
return id(d) as nodeId, id(r) as relId

但是,您的应用程序不应依赖这些 id,因为它们会在删除节点或关系时被 Neo4j 重用。 Neo4j documentation 说:

Neo4j 在节点和关系存在时重用其内部 id 删除。这意味着应用程序使用并依赖于内部 Neo4j id 很脆弱或有出错的风险。因此是 建议宁愿使用应用程序生成的 id。

更多here.

所以,如果你真的想要一个主键,我认为你有两个主要选择:

  1. 在应用程序级别管理主键。即:在访问您的 Neo4j 数据库的应用程序代码中创建并分配唯一 ID。

  2. Use GraphAware UUID plugin。 GraphAware UUID 是一个简单的库,它透明地将 UUID 分配给图中新创建的节点和关系,并确保没有人可以(无意或有意)更改或删除它们。

【讨论】:

  • 谢谢。如果我们保留主键怎么办?我的意思是,例如,如果我保留 Skill_id 怎么办?有错吗?
  • @PTTT 欢迎您!不,这没有错。如果您使用 GraphAware UUID 插件,您可以使用配置参数 com.graphaware.module.UIDM.uuidProperty 自定义属性名称以存储 UUID。
猜你喜欢
  • 2013-12-25
  • 2015-08-20
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
相关资源
最近更新 更多