可调整的版本化图形数据库

Adjustable, versioned graph database

我目前正在从事一个项目,我使用自然语言处理从文本中提取情感,将它们与上下文信息相关联。

上下文信息的定义:与及时描述实体情况相关的所有信息 space.

我要查找的数据结构的描述:

有任意数量的实体(一个实体可以是一个人或一个组,例如(twitter 散列标签)),我想跟踪其中的上下文信息以及他们与其他实体的对话。处理实体之间的对话是为了对它们的情感特征进行分类。基本情感特征由一个向量组成,该向量按百分比指定它们的出现:{fear: 0.1, happiness: 0.4, joy: 0.1, surprise: 0.9, anger: 0} 实体还可以提交他们想要共享的任何上下文信息,例如:位置、室温、血压……等等(将其称为 上下文变量 ). 因为无论是实体的对话数量,还是他们想要共享的上下文变量的数量,在任何时间点都不清楚,因此数据结构需要能够相应地进行调整。

重要:数据中的每个变化也必须代表一个自己的状态,因为我期待将状态的某些变化相互关联。

示例:鲍勃和爱丽丝的谈话显示出高度的恐惧。几个小时后,他们又进行了另一次谈话,不再表现出恐惧,而是高兴。 现在,有人可能会争辩说,高度恐惧,然后是幸福实际上可以解释为情绪缓解。

但是,为了能够提取这些信息,我需要能够将不同的状态相互关联起来。 使用上下文信息将它们与对话中跟踪的情绪相关联也是如此。 这就是为什么每次状态更改都必须记录并可用的原因。

为了让您更清楚,我创建了一个 graphic 并将其附加到问题中。

现在,我的实际问题是:我可以使用哪个 database/data 结构来解决这个问题? 我研究过事件溯源数据库,但不确定是否可以轻松地用它们重新创建图形结构。我也查看了图形数据库,但没有找到我要找的东西。

因此,如果这里有人至少可以指出我正确的方向或帮助我相应地调整我的结构以解决问题,那就太好了。但是,如果有数据结构支持,我称之为 带快照的图形数据库,那么易用性可能是最重要的筛选功能。

你有一个有趣的项目,我不会直接做这样的事情,但为了我的 2 美分 -

我觉得你的照片有点瑕疵。您正在尝试表示图形数据库加班,但实际上并没有办法以这种方式表示时间。 如果我们检查图像,您会发现对话和上下文数据会随时间变化,但 "Bob" 和 "Alice" 以及 "Malory" 实际上不会随时间变化。因此,让我们将它们从等式中删除。

而是专注于您可以随时间建模的事物、对话、上下文、位置。这些东西会随着新数据的进入而改变。这些对象是事件源模型的绝佳候选者。在您的应用程序中,对话将被建模为一系列单独的事件,您的聚合将使用这些事件并结合这些事件并考虑因素以生成最终状态,这将是您的 'relief' 决定。

例如,您可以编写逻辑,如果对话很生气,然后发生了一件非常高兴的事情,那么主体现在会感到如释重负。

我要做的是在连接到 'Fact' 对象 "Bob"、"Alice" 等的图形数据库中对这些对话状态进行建模,以及诸如 'What is alice feeling right now?' 将是通过您的对话状态的图形遍历,考虑到连接到 alice 的上下文数据。

要回答诸如 'What was alice feeling 5 minutes ago?' 之类的问题,您需要获取对话的所有事件流并将它们倒回到适当的点,然后检查对话的状态。

TLDR: 将时间因变量与时间自变量分开,并使用事件源对时间建模。

Rich Hickey(以 Clojure 闻名)有一个名为 Datomic 的数据库,它存储 随时间变化的事实。数据库中的每个条目都是一个带有时间戳的事实,就像在事件溯源中一样只能追加。

可以使用 relational/logical 语言 ala Datalog(类似于 Prolog)来查询这些事实。请参阅 This post by kisai for a quick overview. It has been used for querying graphs with some success in the past: Using Datomic as a Graph Database

虽然我没有使用 Datomic 的经验,但它似乎非常适合您的特定问题。

您在给定时间的状态与具有给定模式的关系数据库之间存在明显的 1:1 对应关系。因此,随着时间的推移,您的状态集与不断变化的模式数据库之间存在明显的 1:1 对应关系,即其值为数据库加元数据的变量,由 DDL 和 DML 更新命令操作。所以没有证据表明您不应该只使用关系型 DBMS。

关系 DBMS 允许在一定的计算复杂度下通过自动实现进行通用查询,并提供一定的优化机会。任何应用程序都可以有专门的查询,使专门的数据结构和运算符成为更好的选择。但是您必须设计您的应用程序并且了解这些特殊方面才能证明这一点。实际上,由于您的状态和关系状态之间存在明显的对应关系,因此这没有道理。

经常使用 EAV 代替 DDL 和不断变化的架构。但是在 EAV 下,DBMS 不知道您所关注的 real 表,这些表的列是 EAV 属性,并且在 DDL/DML 更改模式方法中是明确的。因此,EAV 放弃了简单性、清晰性、优化以及最重要的完整性和 ACID。它只能证明(与 DDL/DML 相比,假设关系表示在其他方面是合适的)通过证明具有模式更新(添加、删除和更改列和表)的 DDL 比你的 EAV 更糟糕(如上所述)特定应用。

仅仅因为您可以在某个时候使用图表来描绘您的应用程序状态并不意味着您需要 graph database. What matters is what specialized queries/expressions you will be evaluating. You should understand what these are in terms of your problem domain, which is probably most easily expressible per some specialized data structure and operators and relationally. Then you can compare the expressive and computational demands to a specialized data structure, a relational representation, and the models of particular graph databases. Be sure to google Whosebug

根据维基百科,“Neo4j 是当今最流行的图形数据库”。