在Neo4J中存储历史事务数据的模式?
我有大约200家实体在过去30年中投资了一家公司。我一直在追踪他们一段时间以来贡献了多少钱。我的数据库将是Neo4J 到目前为止,在我的图表中,我有(1)200个节点,代表已经投资的200个实体,(2)1个节点代表他们投资的单个公司 我认为有两种选择可以代表注资:在Neo4J中存储历史事务数据的模式?,neo4j,schema,Neo4j,Schema,我有大约200家实体在过去30年中投资了一家公司。我一直在追踪他们一段时间以来贡献了多少钱。我的数据库将是Neo4J 到目前为止,在我的图表中,我有(1)200个节点,代表已经投资的200个实体,(2)1个节点代表他们投资的单个公司 我认为有两种选择可以代表注资: 我显式地创建了1500个节点,分别表示初始资本注入、资本增加等。这些节点捕获有关美元金额变化等的信息。然后,我的图形大致如下:(e:Entity)-[:PROVIDES]>(f:Financing{amount:{value},yea
(e:Entity)-[:PROVIDES]>(f:Financing{amount:{value},year:{2010})-[:PROVIDES]>(t:Target)
。在某种程度上,我发现这更为清晰,更易于分析,但这将是一个更大的图表,并且提供的关系不是特别深刻(e:实体)-[:融资{金额:{价值},年份:{2010}]>(t:目标)
。在这种情况下,我有点不确定之后如何处理分析,或者在实体X和目标公司之间建立50种融资关系是否有意义为频繁查询但可能值有限(如年,尤其是仅30年)的数据干杯如果将该
年属性移动到单独的节点上,您会看到更好的性能,这样,您就可以快速地对附加到它的所有节点进行分组,并一次性获取它的year
属性,而不必为它重新创建属性索引。这就需要在本例中添加一个:Financing
节点,以便您可以将:Entity
、:Target
和:Year
节点连接到同一交易记录中
因此,您的数据模型如下所示:
(:Entity) - [:PROVIDES] -> (:Financing {amount: x}) - [:PROVIDES] -> (:Target)
(:Financing) - [:OCCURRED_IN] -> (:Year {year: 1999})
因此,您可以按年份值对数据进行切片,而无需扫描所有节点以查找属性。您还可以在:Financing(year)
上放置属性索引,但将有限的离散属性(如year)建模为单独的路径,可以更轻松地扩展图形,并使良好的查询性能更容易实现
不管怎样,你一定会想要一个<代码>:中间的融资< /代码>节点。除了在结果中返回之外,关系上的属性很少用于任何事情;它们不能被索引,所以它们总是需要属性扫描才能得到结果,如果你有很多关系,那么这些关系加起来会很快
Starter查询(假设所有权为截至给定点提供的总金额的%),以在2004年底按实体获得%的所有权:
MATCH (t:Target {id: 1})
WITH t
MATCH (y:Year)
WHERE y.year <= 2004
WITH t, y
MATCH (y) <- [:OCCURRED_IN] - (f:Financing) - [:PROVIDED] -> (t)
WITH f, f.amount as amt
WITH COLLECT({f: f, amt: amt}) AS rows, SUM(amt) AS total
UNWIND rows AS row
WITH row.f as f, row.amt as amt, total
MATCH (e:Entity) - [:PROVIDED] -> (f)
WITH e, SUM(amt) AS part, total
RETURN e, part/total * 100 AS percentage
MATCH(t:Target{id:1})
与t
比赛(y:年)
其中y.年(f)
以e、金额(金额)作为部分、总计
返回e,部分/全部*100(百分比)
并获得实体2(任意标识符)每年提供的融资比例:
MATCH (t:Target {id:1})
WITH t
MATCH (y:Year)
WITH t, y
MATCH (y) <- [:OCCURRED_IN] - (f:Financing) - [:PROVIDED] -> (t)
WITH y, f, f.amount as amt
WITH y, COLLECT({f: f, amt: amt}) AS rows, SUM(amt) AS total_per_y
UNWIND rows AS row
WITH y, row.f as f, row.amt as amt, total_per_y
MATCH (f) <- [:PROVIDED] - (:Entity {id:2})
WITH y, total_per_y, SUM(amt) AS part_per_y
RETURN y.year, part_per_y/total_per_y*100 AS percentage
MATCH(t:Target{id:1})
与t
比赛(y:年)
用t,y
匹配(y)(t)
以y、f、f.金额作为金额
对于y,收集({f:f,amt:amt})作为行,求和(amt)作为每个y的总和
将行作为行展开
有y,f行为f,M行为金额,y行合计
MATCH(f)非常感谢,这非常有用,最终将解决我的查询!