Java Neo4j图形数据库设计与高效查询

Java Neo4j图形数据库设计与高效查询,java,neo4j,Java,Neo4j,首先让我解释一下我想用neo4j(v2)建模什么 假设表单上有一个n维数据集: val1Dim1, ... , val1Dimn, classValue1 val2Dim2, ... , val2Dimn, classValue2 .... {a set of value of Dim1} {a set of value of Dim2} ... {a set of class values} 每个维度都有一个层次结构(比如说一棵树)。“维度节点”的总数约为1K或稍高,具体取决于数据集 数据

首先让我解释一下我想用neo4j(v2)建模什么

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

val1Dim1, ... , val1Dimn, classValue1
val2Dim2, ... , val2Dimn, classValue2
....
{a set of value of Dim1} {a set of value of Dim2} ... {a set of class values}
每个维度都有一个层次结构(比如说一棵树)。“维度节点”的总数约为1K或稍高,具体取决于数据集

数据挖掘方法()在数据集上运行,并从数据集中提取大量模式

基本上,每种图案都在表格上:

val1Dim1, ... , val1Dimn, classValue1
val2Dim2, ... , val2Dimn, classValue2
....
{a set of value of Dim1} {a set of value of Dim2} ... {a set of class values}
至少有大约11米的开采模式

我的设计选择

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

  • 数据(例如val1Dim1是一个数据节点)=>大约1K个节点。这些节点有三个属性:LABEL(值本身)、维度id、维度和一个构建属性KEY,即“dimension\u LABEL”。已在键上定义索引

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

2.关系类型:

  • 是表示在层次结构中导航的泛化/专门化关系的吗

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

这是一个玩具图,让我的设计选择清楚

数据插入和规范

我使用过batch inserter,它的工作速度非常快(大约40分钟)。DB的大小约为50Gb,由大约1100万个节点和1B(!!)关系组成。目前,我正在我的机器上运行代码(8GB的RAM、Intel i7和500GB的SSD HD)。我使用Java

我想做什么

给定每个维度的值,我想知道模式是什么,以便所有维度值都包含在模式中

目前,假设我使用两个维度来实现我的目标:

match (n:DATA {KEY:'X'})-[r:COMPOSED_BY]-(p:PATTERN)-[r2:COMPOSED_BY]-(m:DATA {KEY:'Y'}) 
return p;
目前,它的速度非常慢……而且java进程的内存使用量是2GB(最大)

我的问题

  • 你认为graphDb适合这种情况吗
  • 我的设计选择合适吗
  • 索引呢?我还需要定义一些吗
  • 查询数据库的方法可以吗
  • 是否有一些配置技巧可以加速查询阶段
  • 适合我的应用程序需要的服务器规格是什么
  • 提前谢谢


    Yoann

    我有一些建议。您可以使用节点标签(不是节点的属性)。有关节点标签的详细信息,请参阅

    因此,如果使用标签,特定尺寸的所有标签将自动分类在一个集合(即标签)下。因此,您将减少维护为
    IS_A
    的关系的数量。而且,由于关系在空间上更昂贵,您可以减少数据库的大小。此外,在标签上进行索引搜索也可用,并且比在整个索引中搜索键更快

    在下面的模型中,在每个维度节点(
    DATA
    )下,我添加了两个属性
    key
    value
    ,您可以只保留其中一个作为
    key
    ,然后简单地对其进行索引。因此,当您需要值时,只需解析键。(只是一个建议,我不知道你将拥有什么样的用例)

    欢迎提出建议和意见

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


    评论后编辑

    根据您的评论,为了减少模式节点的数量,您可以通过创建唯一的
    关系类型
    来链接
    数据
    节点本身,并根据
    模式
    命名它们。有关更多说明,请参阅更新的图表


    你能发布一个图表的虚拟图吗?这样我可以在发表评论之前更好地可视化你的模型吗?@SumeetSharma我已经编辑了我的文章。谢谢。谢谢你的建议。重点是我已经在使用标签来区分数据节点(白色)和模式节点(灰色)。实际上,没有太多的是关系(大约1K)。我的主要问题是模式的数量(11M)以及由关系组成的_的数量(200M)。我想要运行的典型查询是“给定一些数据节点N,模式p是什么,使得p和N中的每个数据节点之间存在一个由关系组成的_?”。另外,您正在使用的标签是数据。。我建议不要使用数据作为标签,而是使用A/DIM1或B/DIM2作为标签,将维度中的节点集分隔在各个集合下。不要创建模式节点,而是创建名为patterns p1、p2的唯一关系类型,将模式中的节点集链接起来。您的想法看起来it’很有趣。我将立即调查它,并让您了解对性能的影响。此外,您认为自动索引关系会显著加快查询速度吗?如果您在关系中有任何属性,则可以对关系进行自动索引。如果您有属性名称,请在关系上说p1shiptype p1然后您可以在relationship name属性上自动索引。但是在我建议的内容中,您正在创建一个具有相关标签的新relationshiptype,这样就足以让cypher匹配模式。因此,当您实际查询图形时,您只需将ur图形中的模式与特定于ur模式的relationshiptype匹配即可快一点。我想做的正好相反,比如val1,val2,…,valn(其中vali是键值)都在一起的模式是什么。看起来节点索引(键)更可取,不是吗?