- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我似乎找不到关于此的任何讨论。我一直在想象一个无模式、基于节点和分层的数据库,有一天我认为它不存在太常识了,所以我开始四处搜索,neo4j 大约是我想象的 95%。
我没有想到的是关系的概念。我不明白为什么他们是必要的。它们似乎为所有以图形数据库为中心的主题增加了大量的复杂性,但我不太明白有什么好处。关系似乎几乎完全像节点,除了更有限。
为了解释我的想法,我想象着开一家公司,所以我创建了自己作为我的第一个节点:
create (u:User { u.name:"mindreader"});
create (c:Company { c.name:"mindreader Corp"});
有一天我得到了一个客户,所以我把他的公司放到了我的数据库中。
create (c:Company { c.name:"Customer Company"});
create (u:User { u.name:"Customer Employee1" });
create (u:User { u.name:"Customer Employee2"});
我决定将用户链接到他们的客户
match (u:User) where u.name =~ "Customer.*"
match (c:Company) where c.name =~ "Customer.*
create (u)-[:Employee]->(c);
match (u:User where name = "mindreader"
match (c:Company) where name =~ "mindreader.*"
create (u)-[:Employee]->(c);
然后我雇了一些人:
match (c:Company) where c.name =~ "mindreader.*"
create (u:User { name:"Employee1"})-[:Employee]->(c)
create (u:User { name:"Employee2"})-[:Employee]->(c);
有一天,人力资源部说他们需要知道我何时雇用了员工。好的:
match (c:Company)<-[r:Employee]-(u:User)
where name =~ "mindreader.*" and u.name =~ "Employee.*"
set r.hiredate = '2013-01-01';
然后 hr 回来说,嘿,我们需要知道公司中的哪个人招聘了新员工,以便他们可以获得现金奖励。
好吧,现在我需要的是指向用户的关系,但这是不允许的(:Employee 关系和用户之间的 Hired_By 关系)。我们可以有一个额外的关系 :Hired_By,但是如果 :Employee 关系被删除,除非有人记得删除它,否则 hired_by 将保留。
我本可以在 neo4j 中做的只是有一个
(u:User)-[:hiring_info]->(hire_info:HiringInfo)-[:hired_by]->(u:User)
在这种情况下,关系仅提供最少的信息,即名称。
我最初的设想是会有节点,然后节点的每个属性可以是数据类型,也可以是指向另一个节点的指针。在我的例子中,用户记录最终看起来像:
User {
name: "Employee1"
hiring_info: {
hire_date: "2013-01-01"
hired_by: u:User # -> would point to a user
}
}
本质上它仍然是一个图表。节点相互指向。关系的名称只是源节点中的一个字段。要查询它,您只需去
match (u:User) where ... return u.name, u.hiring_info.hiring_date, u.hiring_info.hired_by.name
如果您需要相同类型的一对多关系,您只需要一组指向节点的指针。如果您引用一个集合作为返回,您实际上会得到一个连接。如果删除 hiring_info,它会删除指针。对其他节点的引用不必是节点顶层的无组织列表。此外,当我查询每个用户时,我将知道有关用户的所有信息,而无需查询用户本身及其所有关系。我会知道他的名字以及他在同一个查询中雇用某人的事实。从数据库后端来看,我不确定会有多大变化。
我看到很多人问他们是否应该使用节点或关系来建模这个或那个,偶尔还有人问关系之间的关系。这感觉就像是 XML 问题,你想知道一条信息应该是它自己的标签还是只是它的父标签的属性。
查询引擎煞费苦心地处理关系,因此拥有它们一定有一些巨大的优势,但我不太明白。
最佳答案
不同的数据库用于不同的事情。您似乎在寻找 noSQL 数据库。
您已经涉及到一个非常广泛的主题领域,所以我将简要介绍一下。数据库模式有很多种,每种模式都有不同的用例。
NoSQL 又名非关系数据库:
每个对象都是一个文档。您可以引用其他文档,但任何额外的遍历都意味着您正在进行另一个查询。当您的数据之间经常没有关系,并且通常只想查询一次并拥有大量灵活存储的数据作为返回的文档时注意:这些不是“节点”。节点有一个非常具体的定义,并暗示有边。)
SQL 又名关系数据库:
这是表域,这是外键和一对多关系发挥作用的地方。这里有严格的模式和非常快速的查询。老实说,这就是您应该用于您的用户示例的内容。事物之间关系较浅的少量数据(您不必跟踪关系超过 1-2 次即可到达相关条目)是这些数据的优势所在。
图数据库:
当关系是您尝试做的事情的关键时,请使用此方法。最常见的图表示例类似于社交图表,您可以在其中将不同的用户连接在一起,并且需要在许多步骤中遵循关系。 (例如,计算两个人是否在深度为 4 的范围内连接)
图数据库中存在关系,因为这是图数据库的全部概念。它并不真正适合您的应用程序,但公平地说,您可以在数据库的节点部分保留更多内容。一般来说,数据库的整体理念是让您可以非常快速地查询大量数据。根据数据的内在结构,有不同的方法是有意义的。因此出现了不同类型的数据库。
在强连接图中,Neo4j 在 1000 倍的数据上比 SQL 数据库快 1000 倍。 NoSQL 可能永远无法在强连接图场景中执行。
关于neo4j - 为什么关系作为一个概念通常存在于 neo4j 或图形数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20436476/
时间过后如何用javascript或任何其他解释语言实现的函数被调用? 换句话说,在javascript解释器中是否存在循环,该循环始终检查计时器列表,或者操作系统是否有任何特定方式来处理此循环? 谢
我有项目要做。假设是这样的: 从带有单词的文件中,我只需要阅读字母单词(进入名为Words的列表-下面的代码)-我是使用lib中的isalpha()函数做到的。列表的每个元素包含一个单词 我需要从输入
我有两套test和 test1我需要从 test 中删除元素存在于 test1例如 如果test包含 1,2,3,4,5 和 test1包含 3,5,6,7:那么函数应该在 test 上执行所以里面只
引用指针导致间接使用对象的值。但我从来没有真正理解“使用”是什么意思。我开始思考这个问题,直到我的编译器对以下代码产生错误 int i = 0, *pi = &i; decltype(*pi) c;
我读了很多关于 Taint在 Perl 变量、模式等中,例如来自 docs : $AUTOLOAD can now be tainted If you call a subroutine by a t
我一直在研究 FP 语言(断断续续),并且使用过 Scala、Haskell、F# 和其他一些语言。我喜欢我所看到的并理解 FP 的一些基本概念(绝对没有范畴论的背景——所以请不要谈论数学)。 所以,
在C语言中,当您想要进行通用编程时,唯一受语言支持的选项是宏。它们效果很好并且被广泛使用,但是如果可以使用内联函数或常规函数,则不建议使用它们。 (如果使用gcc,您还可以使用gcc statemen
我有一些代码可以进行 requests.get() 调用,这可能会以各种方式失败。我想捕获 requests 异常,但不关心调用失败的原因。 我想避免这样的代码 try: r = reques
我正在尝试编写一个 C 解析器,用于我自己的教育。我知道我可以使用像 YACC 这样的工具来简化这个过程,但我想尽可能多地从经验中学习,所以我从头开始。 我的问题是我应该如何处理这样的一行: doSo
我正在设计一个系统,但我认为让最终用户能够删除数据库中的条目并不是一个好主意。我是这么认为的,因为通常最终用户一旦获得管理员权限,最终可能会在数据库中弄得一团糟,然后求助于我来修复它。 当然,如果他们
我们有两张 table 。第一个包含名称 (varchar) 字段。第二个包含引用第一个表中的名称字段的字段。第二个表中的外键将针对与该名称关联的每一行重复。通常不鼓励使用 varchar/strin
我正在为 Apple Watch 开发一个非常简单的锻炼应用程序。它使用 Health Kit 开始和结束锻炼,我唯一的问题是,当我尝试结束锻炼时,它通常不会结束 session ,我收到此错误 20
当前,我们在执行sql查询脚本时遇到一些失败的问题。 错误讯息为, ” 系统断言检查失败。检查SQL Server错误日志以获取详细信息。通常,断言失败是由软件错误或数据损坏引起的。要检查数据库是否损
这是一个非常简单的问题,但我似乎找不到在某些情况下选择一个而不是另一个的一般规则。 假设我有一个简单的 Point 类,如下所示: class Point { public: Point();
这个问题在这里已经有了答案: Java Programming - Where should SQL statements be stored? [closed] (15 个答案) 关闭 9 年前。
我很欣赏这个问题可能有点“基于意见”,但是,我认为一个概括的答案可以极大地帮助将来有兴趣了解更多关于 PWA 和 Service Workers 的其他人。 背景 我在网上搜索过,但很惊讶地发现没有明
对于编程语言解释器,我想知道解释器经历的事件顺序。例如,我认为事情是这样的: 解释器得到一些输入 词法分析器/分词器获取输入并划分标记 x 获取代币列表 ??? 代码被执行 什么步骤属于 ??? sp
我是 Flutter 的新手,刚刚从阅读有关 Flutter 的教程中听说了 BLoC 概念。从这里 tutorial ,第一次听说BLoC。但是我在这篇文章中也看到了一个名为“Repository”
我正在为下/上三角矩阵(double)编写一个类。通过利用 n*n 三角矩阵只有 n*(n + 1)/2 [可能非零] 元素这一事实,我在内部只存储平面数组成员中的元素数量。 首先,我有一个“普通”(
我有一个 Java src 文件夹,我在其中存储我的 .java 文件。然后我使用终端编译它们并最终在同一目录中获得 .class 文件。这不一定会打扰我,但我从未见过专业人士这样做。 按照专业惯例(
我是一名优秀的程序员,十分优秀!