我正在尝试使用多语言图形数据库,但我正在努力寻找如何实现最佳模型。
我目前的提议是制作两种节点类型:Movie和MovieTranslation.
Movie持有所有的关系likes,related,ratings和comments。MovieTranslation包含所有可翻译数据 ( title, plot, genres)。一个Movie节点不包含这些类型的属性,只有original_title。
Movie并MovieTranslation通过translation关系联系在一起。
当我查询节点时,我会检查它们是否translation与查询的语言环境(例如 en_US)有关系。如果为 true,则将翻译与主节点合并作为结果。
我认为这种方式可能不是最好的,但我想不出更好的方式。
你们对数据库模型有更好的建议吗?将不胜感激。
如果您需要此信息,我正在使用 neo4j。
谢谢,维尼修斯。
为一个应用程序实现两个或多个数据库是否设计不好/困难?
例如,假设我有User一些想要存储到关系数据库中的对象。这些“用户”对象彼此之间存在关系,并且有用户提要(想想 Twitter / Facebook),我想存储这些关系以便能够找到朋友的朋友,看看我对一系列信息的“深入”程度提要等。这些关系将存储在图形数据库中。
有没有更好的方法来解决这个问题,或者使用图形数据库进行关系和使用关系数据库进行数据存储是最好的解决方案?
我是论坛的新手,刚刚开始使用Neo4J.为我冗长的问题和背景信息道歉,但我认为这有助于解释我想要解决的问题.
我经常为公司从事商业智能和数据仓库项目.当我们创建商业智能需求时,我们通常需要创建一个我们感兴趣的业务指标列表(销售收入,利润率,总费用),并记录如何使用我们的底层系统的数据属性计算这些业务指标.通常,我们以数据要求电子表格的形式记录excel中的大部分工作.我们创建一个业务指标列表,然后创建一堆列,其中包含描述,源数据属性,计算等.我正在尝试做的事情(作为个人方项目)是开发一个应用程序,我们可以用它来记录这种类型的而是元数据信息.我已经阅读了一些Neo4j书籍和在线文章,我认为Neo4j非常适合这个用例,现在我正在尝试记录基本数据模型以帮助我入门.
起初我想出了一些相当直接的东西,如左下图所示,从以下几点开始:
销售收入= Unit_Price*Count_Units_Sold
然而,我很快意识到计算本身对我来说非常重要,我可能稍后想要获取有关它的更多信息,例如添加不同版本的计算或添加注释以进一步描述它.我根据左上方的图像修改了模型,使"计算本身"成为一个单独的节点.
但是,当我开始研究更复杂的指标时,我仍然不确定如何最好地表示计算的细节.如果我采用以下示例,我将按如下方式对其进行建模.
薪水= Salary_Amount + Overtime_Amount - 税额
现在这清楚地表示了计算中使用的数据属性(3或它们),但我不知道如何表示计算本身.例如,通过首先将Salary_Amount添加到Overtime_Amount然后减去Tax_Amount来定义计算.当我有更复杂的计算涉及除法和乘法时需要按特定顺序执行时,这将变得更加复杂.基本上我希望能够从模型推断出计算如下:
薪水= Salary_Amount + Overtime_Amount - 税额
相反:
薪水=薪资_安装*税额/加班金额
要么:
薪水=税额*加班金额 - 工资金额
我正在寻找一些方法来定义计算节点,从而我可以对数据属性的使用方式进行排序.可能我应该将计算存储为计算属性中的文本字符串,但我不禁认为这可能会让我感到痛苦,并限制我在多个时候从图中获取有用信息的能力数据属性用于不同的计算.
注意:我确实在论坛上看到了类似主题的这个问题,但没有收到很多回复,所以即使我的问题类似,我提供更多的背景信息可能会带来更多的见解.
非常感谢,迈克尔
我在回顾@ChristopheWillemsen和@ stdob--的答案后正在编辑这个问题.
首先感谢两位贡献者.答案和参考资料非常有用,都满足了我的要求.最初我按照@ stdob的答案倾向于使用反向波兰表示法 - 因为它提供了一种处理分组操作的简洁方法(例如我的数学公式中的括号).但是,在尝试以两种方式对我的数据进行建模之后,我发现在第一篇文章中我没有涉及额外的要求,即捕获逻辑表达式,如"If,Where,Having".基本上我希望能够捕获超出纯数学表达式的ETL类型转换规则,我认为@ChristopheWillemsen的解决方案将支持这一点.
以下是我使用这种方法建模基本公式的方法:
但是,我也有更复杂的逻辑,我想建模.这些是ETL类型规则,通常在定义数据仓库或BI项目的业务需求时将其捕获为伪代码或SQL形式.下面是一个示例,我将定义ETL如何计算保险公司的新索赔计数度量的逻辑.
这就是我对@ChristopheWillemsen在下面第一个答案中提供的解决方案进行建模的方法.
你能看看这个,看看这是否是一个合适的模型.从需求的角度来看,我希望能够:
这看起来像是对这类信息进行建模的合适方法吗?欢迎任何建议或改进?
我有一个数据建模问题。我拥有的数据基本上是与其他节点有关系的节点。节点具有属性。边是有方向的并且具有属性。我正在探索像 Neo4j 这样的 Graph DB 是否合适。
怀疑是因为:我拥有的数据是基于时间的。它随时间变化,我也需要跟踪历史数据。例如,我应该能够查询:
我进行了搜索,但找不到令人满意的资源,我可以在其中了解如何将时间考虑到 Graph DB 中。您认为使用 Graph DB 可以固有地满足我的要求吗?是否有一个示例/资源/文章描述了 Neo4j 或任何其他图形数据库?
我想确保数据库可扩展到大约 10 万个节点和数百万条边。我正在优化时间而不是空间。
我有一个用例,我需要在一个大房间内对人们的轨迹进行分类。
在性能和最佳 Neo4j 实践方面,如果我想对这些数据进行分类以便以后能够使用这些分类的任何类型组合进行搜索/获取,那么哪种选择会更好?
不同的分类是:
轨迹包含一组点(时间、x、y、motion_type),基本上可以告诉人去了哪里。一个点告诉您在给定时间该人在房间中的确切位置,以及他是在居住、行走还是跑步(这是运动类型)。
例如,获取年龄在 21 到 30 岁之间的女性、客户的所有轨迹
选项1:
// Here I get the set of trajectories that fall within a certain time range (:Trajectory(at) is indexed)
MATCH (trajectory:Trajectory)
WHERE datetime("2020-01-01T00:00:00.000000+13:00") <= trajectory.at < datetime("2020-01-11T00:00:00.000000+13:00")
// Once I have all the trajectories I start filtering by the different criteria
MATCH (trajectory)-[:GENDER]->(:Female)
MATCH (trajectory)-[:PERSON_TYPE]->(:Customer)
// AgeGroup could have quite a lot of groups depending on how accurate the data is. At this stage we …Run Code Online (Sandbox Code Playgroud) 我想知道像 Dgraph 和 TigerGraph 这样的数据库如何设法对图进行分片,以支持水平缩放而不破坏节点之间的连接,此外还支持许多有趣的算法。
他们声称是本地图形解决方案,因此像 facebook 或 twitter 这样的方法在这里并不适用。
我想到的唯一解决方案是将图分散到如此多的小型数据库中,这会导致大量节点重复以维持关系。
有任何想法吗 ?
提前致谢
我正在尝试使用 gremlin npm 模块并连接到 Neptune 数据库。在测试期间,我尝试让 gremlin 连接到非活动端点和无效 url,以使系统更具弹性。我预计会抛出某种错误。但是,对于无效/不活动的 url,图形遍历不会在没有消息传递的情况下解决。
const traversal = gremlin.process.AnonymousTraversalSource.traversal;
const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;
const dc = new DriverRemoteConnection('wss://localhost:80');
const g = traversal().withRemote(dc);
const data = await g.V().limit(1).toList();
console.log(data);
Run Code Online (Sandbox Code Playgroud)
我希望g.V().limit(1).toList()在使用无效的远程连接时抛出错误。同样,promise 永远不会解决,console.log(data)下一行的 永远不会运行。
对此的任何帮助将不胜感激!我需要某种系统来检测数据库连接是否有效,如果无效则记录错误。
从主 Neo4j 图表创建命名图表已被记录。此外,人们还知道如何列出、删除、检查命名图是否已存在,例如CALL gds.graph.exists('my-store-graph') YIELD exists;
但是,我想知道是否有任何方法可以针对刚刚创建的命名图进行密码查询?
一种解决方法是将此命名图推送到离线/空Neo4j 图,即CALL gds.beta.graph.export('my-graph', { dbName: 'mydatabase' }). 然而,这种方法不太方便,因为我们经常想在应用之前检查命名图是否正确投影,例如其上的PageRank。并且预测可能是一个反复试验的循环。
从实际角度来看,我一直在努力理解这些技术何时有用,以及它们之间有何不同。专家可以检查一下我的理解吗?
图形数据库:当关系复杂、继承、以不同程度的置信度推断并且可能发生变化时,图形数据库比关系数据库更容易理解和管理。一些示例:用户不知道他们需要层次结构的深度;从社交媒体推断关系,对 ID 解析、主题解析和关系强度有不同程度的置信度;或者不知道他们要存储什么类型的呼叫中心数据;所有这些都可以存储在关系数据库中,但它们需要不断更新。它们对于某些任务也更具表现力。
本体:这些正式且标准化的知识表示用于打破数据孤岛。例如,假设一家 B2B 销售公司从多个不同的业务领域获得收入,其中包括一次性付款、订阅、IP 销售和咨询服务。收入数据存储在许多不同的数据库中,这些数据库具有很多特性。本体允许用户将“客户付款”定义为“创造或退还收入”的任何内容,以便主题专家可以在其数据库中适当地标记付款。本体可以与图数据库或关系数据库一起使用,但是对类继承的强调使得它们在图数据库中更容易实现,在图数据库中可以轻松地对类的分类进行建模。
知识图:知识图是一种图数据库,其中语言(含义、实体和节点分类法)由本体管理。因此,在我们的 B2B 示例中,“客户付款”边缘具有一次性付款、订阅等子类型,并将“客户”类连接到“业务线”类。
这基本上是正确的吗?
AWS Neptune 内部存储数据的方式与 Neo4j 存储数据的方式有什么区别?在这篇文章中,它说 Neo4j 将每个节点存储为与其连接的节点的直接链接,“关系被组织为双向链表”。据我了解, AWS Neptune 基本上是一个关系数据库,带有一些允许图形查询的索引。这准确吗?这两种代表有什么主要优势吗?
附加问题:
我猜测 AWS Neptune 是建立在 RDS(关系数据库服务)之上的。AWS 选择在 RDS 之上构建 Neptune 而不是创建一个全新的数据库是否有实际原因?我认为在 RDS 之上构建会为数据复制等事情节省大量时间和精力。我并不是要持怀疑态度或开始阴谋,我只是想评估图形数据库,这让我很好奇。
amazon-web-services neo4j graph-databases gremlin amazon-neptune