Java Neo4j图形数据库设计与高效查询
首先让我解释一下我想用neo4j(v2)建模什么 假设表单上有一个n维数据集: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或稍高,具体取决于数据集 数据
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个节点
- 是表示在层次结构中导航的泛化/专门化关系的吗
- 将模式链接到其每个成员(例如,如果p={val1dim1,val2Dim1}{val1Dim2}是一个模式,则创建3个关系,即p->va11Dim1,p->val2Dim1和val1dim1
match (n:DATA {KEY:'X'})-[r:COMPOSED_BY]-(p:PATTERN)-[r2:COMPOSED_BY]-(m:DATA {KEY:'Y'})
return p;
目前,它的速度非常慢……而且java进程的内存使用量是2GB(最大)
我的问题
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是键值)都在一起的模式是什么。看起来节点索引(键)更可取,不是吗?