Neo4j图数据库设计和高效查询

时间:2014-01-23 17:12:16

标签: java neo4j

让我首先解释一下我想用neo4j建模的内容(v2)

假设表格上有一个n维数据集:

val1Dim1, ... , val1Dimn, classValue1
val2Dim2, ... , val2Dimn, classValue2
....

每个维度都有一个层次结构(比如一棵树)。 “维度节点”的总数约为1K或稍高,具体取决于数据集。

在数据集上运行数据挖掘方法(link to the scientific paper),并从数据集中提取大量模式。

基本上,每种模式都在表格中:

{a set of value of Dim1} {a set of value of Dim2} ... {a set of class values}

至少有大约11M的开采模式。

我的设计选择

2种类型的节点(标签):

  • DATA(例如val1Dim1是DATA节点)=>大约1K个节点。这些节点有三个属性:LABEL(值本身),维度ID,DIMENSION和内置属性KEY,即“DIMENSION_LABEL”。已在KEY上定义索引。

  • PATTERN(每个模式一个)=>至少11M节点

2种关系:

  • IS_A表示用于浏览层次结构的泛化/特化关系

  • COMPOSED_BY将模式链接到其每个成员(例如,如果P = {val1dim1,val2Dim1} {val1Dim2}是模式,则3个关系,即P-> va11Dim1,P->创建了val2Dim1和val1Dim1。

这是一个玩具graphDb,可以让我的设计选择清晰 enter image description here

数据插入和规范

我使用批量插入器,它的工作速度非常快(约40分钟)。 DB的大小约为50Gb,由大约11M节点和1B(!!)关系组成。现在,我在我的机器上运行代码(8GB RAM,Intel i7和500GB SSD HD)。我正在使用Java。

我想做什么

给定每个维度的值,我想知道什么是模式,以便模式中涉及所有维度值。

目前,假设我使用的查询的2个维度是实现我的目标:

match (n:DATA {KEY:'X'})-[r:COMPOSED_BY]-(p:PATTERN)-[r2:COMPOSED_BY]-(m:DATA {KEY:'Y'}) 
return p;

目前,它非常慢......而且java进程的内存使用量是2GB(最大值)

我的问题

  1. 你认为graphDb适合这种情况吗?
  2. 我的设计选择好吗?
  3. 索引怎么样?我还需要定义更多吗?
  4. 是查询db的方法吗?
  5. 是否有一些配置技巧可以加快查询阶段?
  6. 哪种服务器规格适合我的应用需求?
  7. 提前致谢

    的Yoann

1 个答案:

答案 0 :(得分:1)

我的建议很少。您可以使用节点标签(不作为节点的属性)。有关节点标签的详细信息,请参阅here

因此,如果您使用标签,则特定维度的所有标签将自动归类为一组(即标签)。因此,您将减少保持为IS_A的关系数量。由于关系在空间方面更加昂贵,因此可以减小数据库的大小。此外,标签上的索引搜索也可用,并且比在整个索引中搜索密钥快。

在每个维度节点(DATA)下面的模型中,我添加了两个属性keyvalue,您只能将其中一个保留为key和然后简单地索引它。因此,当您需要该值时,只需解析密钥。(只是建议不了解您将要使用的用例类型)

欢迎提出建议和意见。

如果您需要更多信息,请回复。


在评论后修改

根据您的评论,为了减少模式节点的数量,您可以根据DATA创建唯一的relationshipTypes来命名PATTERNS节点本身。有关更多说明,请参阅更新的图表

Model I would suggest