1

这是我的场景。我有一个预定义的书籍数据类型结构。为了简单起见,仅以它为例。结构如下图所示。这是一个带标签的属性图,信息是不言自明的。这个数据类型结构是固定的,我不能改变它。我只是用它。

DTR 示例

当有 1 本书时,我们称它为Harry Potter,在系统中,它可能如下所示:

DTR 1 本书

因此,这本书有自己的属性(ID、Name、...),并且还包含一个字段 type MandatoryData。通过查看此图,我们可以了解有关该书的所有信息。

当我在系统中有 2 本书时会出现问题,如下所示:

DTR 2 本书

在这种情况下,还有一本名为Graph DB的书,其中突出显示了这些信息。

这种设计的问题是:我们不知道哪些信息属于哪本书。例如,我们不能再区分publishedYear了。

我的问题是:如何解决或避免这个问题?MandatoryData我应该为每本书创建 1个吗?你能给我推荐什么设计吗?

我正在使用 Neo4j 和 Cypher。谢谢您的帮助!

4

1 回答 1

0

更新

来自评论(@AnhTriet):

谢谢你的建议。但我想在这些书之间建立某种联系。如果我们创建新的 MandatoryData,这些书籍将完全分开。(...)我的意思是,如果两本书有相同的作者或出版年份,它们应该指向一些相同的节点,对吧?

在评论中进行了一些澄清之后,我建议MandatoryData为数据库中的每个属性创建一个节点。然后,您将MandatoryData根据书的属性数量将给定的书连接到各个节点。

这样,同一作者的两本书将连接到同一个 MandatoryData 节点。


由于您无法更改数据模型,因此我强烈建议您为MandatoryData添加到系统中的每本新书创建一个新节点。

这样,您将能够通过以下查询获取有关特定书籍的信息:

// Get the author's name of the book with ID = 1
MATCH (:Book {ID : 1})-->(:MandatoryData)-->(:Author)-->(:Name)-->(v:Value)
RETURN v.value

您的问题中提出的模型不可行,因为无法识别特定财产的所有者,正如您所指出的那样。

于 2017-11-22T15:46:24.703 回答