Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Neo4J中存储历史事务数据的模式?_Neo4j_Schema - Fatal编程技术网

在Neo4J中存储历史事务数据的模式?

在Neo4J中存储历史事务数据的模式?,neo4j,schema,Neo4j,Schema,我有大约200家实体在过去30年中投资了一家公司。我一直在追踪他们一段时间以来贡献了多少钱。我的数据库将是Neo4J 到目前为止,在我的图表中,我有(1)200个节点,代表已经投资的200个实体,(2)1个节点代表他们投资的单个公司 我认为有两种选择可以代表注资: 我显式地创建了1500个节点,分别表示初始资本注入、资本增加等。这些节点捕获有关美元金额变化等的信息。然后,我的图形大致如下:(e:Entity)-[:PROVIDES]>(f:Financing{amount:{value},yea

我有大约200家实体在过去30年中投资了一家公司。我一直在追踪他们一段时间以来贡献了多少钱。我的数据库将是Neo4J

到目前为止,在我的图表中,我有(1)200个节点,代表已经投资的200个实体,(2)1个节点代表他们投资的单个公司

我认为有两种选择可以代表注资:

  • 我显式地创建了1500个节点,分别表示初始资本注入、资本增加等。这些节点捕获有关美元金额变化等的信息。然后,我的图形大致如下:
    (e:Entity)-[:PROVIDES]>(f:Financing{amount:{value},year:{2010})-[:PROVIDES]>(t:Target)
    。在某种程度上,我发现这更为清晰,更易于分析,但这将是一个更大的图表,并且提供的关系不是特别深刻

  • 我将这1500轮融资更直接地表示为200家实体与目标公司之间的关系
    (e:实体)-[:融资{金额:{价值},年份:{2010}]>(t:目标)
    。在这种情况下,我有点不确定之后如何处理分析,或者在实体X和目标公司之间建立50种融资关系是否有意义

  • 我想做的分析类型包括(1)生成目标实体的所有权,比如2004年,(2)生成实体X在目标公司的持股随时间的演变,等等

    您会推荐什么作为模式的解决方案?我知道Neo4J是模式可选的,但我怀疑节点和关系之间的选择很重要

    非常感谢


    为频繁查询但可能值有限(如年,尤其是仅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)非常感谢,这非常有用,最终将解决我的查询!