让我首先解释一下我想用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,可以让我的设计选择清晰
数据插入和规范
我使用批量插入器,它的工作速度非常快(约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(最大值)
我的问题
提前致谢
的Yoann
答案 0 :(得分:1)
我的建议很少。您可以使用节点标签(不作为节点的属性)。有关节点标签的详细信息,请参阅here
因此,如果您使用标签,则特定维度的所有标签将自动归类为一组(即标签)。因此,您将减少保持为IS_A
的关系数量。由于关系在空间方面更加昂贵,因此可以减小数据库的大小。此外,标签上的索引搜索也可用,并且比在整个索引中搜索密钥快。
在每个维度节点(DATA
)下面的模型中,我添加了两个属性key
和value
,您只能将其中一个保留为key
和然后简单地索引它。因此,当您需要该值时,只需解析密钥。(只是建议不了解您将要使用的用例类型)
欢迎提出建议和意见。
如果您需要更多信息,请回复。
在评论后修改
根据您的评论,为了减少模式节点的数量,您可以根据DATA
创建唯一的relationshipTypes
来命名PATTERNS
节点本身。有关更多说明,请参阅更新的图表