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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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
Database 树结构数据的图形数据库或关系数据库_Database_Neo4j_Graph Databases - Fatal编程技术网

Database 树结构数据的图形数据库或关系数据库

Database 树结构数据的图形数据库或关系数据库,database,neo4j,graph-databases,Database,Neo4j,Graph Databases,我每年都有公司持有分层结构的数据。例如,A公司持有B公司50%的股份,B公司持有C公司50%的股份,D公司持有C公司50%的股份。每个公司都有自己的财产,如工业 写操作很少,大部分是读操作。具体地说,从一组节点(根)开始,通过跟踪特定的百分比共享阈值来提取族谱。家谱中有几个有趣的指标 对于每个节点: 从根部开始的深度 从根开始逐层共享的乘积,例如A持有C的0.5*0.5=25% 对于每个级别: 每个根的份额分配 产业布局 请注意,每个节点可能有多个根,我们对所有根都感兴趣 目前,数据存储在关系数

我每年都有公司持有分层结构的数据。例如,A公司持有B公司50%的股份,B公司持有C公司50%的股份,D公司持有C公司50%的股份。每个公司都有自己的财产,如工业

写操作很少,大部分是读操作。具体地说,从一组节点(根)开始,通过跟踪特定的百分比共享阈值来提取族谱。家谱中有几个有趣的指标

对于每个节点:

  • 从根部开始的深度
  • 从根开始逐层共享的乘积,例如A持有C的0.5*0.5=25%
  • 对于每个级别:

  • 每个根的份额分配
  • 产业布局
  • 请注意,每个节点可能有多个根,我们对所有根都感兴趣


    目前,数据存储在关系数据库中,上面描述的任务是通过连接完成的。像neo4j这样的图形数据库是否更适合数据和此任务?问题的关键是要有一个合适的索引,这样就不必每次都加入。如果您有任何建议和建议,我们将不胜感激。

    Neo4j非常适合在这里使用

    Neo4j确实使用索引来查找图中的起始点,例如根节点。如果您只是使用它来获取根节点,那么这就是整个查询的单个索引查找


    从这里开始,遍历树就是遍历关系,这只是指针跳转节点引用->关系引用->节点引用等,不涉及连接。然后,您只需计算每个路径节点中的数字即可获得百分比。

    几乎任何图形数据库都可以为您描述的信息建模。在每种产品中,如何构造查询以获得所需内容将是不同的

    在InfiniteGraph中,我们可以使用以下模式对信息进行建模:

    UPDATE SCHEMA {
        CREATE CLASS Company {
            name        : String,
            industry    : String, 
            
            owns        : LIST {
                            element: Reference {
                                edgeClass       : Owns,
                                edgeAttribute   : owns
                            },
                            CollectionTypeName  : SegmentedArray
                        },
            ownedBy     : LIST {
                            element: Reference {
                                edgeClass       : Owns,
                                edgeAttribute   : ownedBy
                            },
                            CollectionTypeName  : SegmentedArray
                        }
            
        }
        
        CREATE CLASS Owns
        {
            percentage  : Real { Storage: B32 },
            owns        : Reference {referenced: Company, inverse: ownedBy },
            ownedBy     : Reference {referenced: Company,  inverse: owns }
        }
    };
    
    然后我们可以加载您在问题中提到的数据:

    LET coA = CREATE Company { name: "A", industry: "Manufacturing" };
    LET coB = CREATE Company { name: "B", industry: "Manufacturing" };
    LET coC = CREATE Company { name: "C", industry: "Retail" };
    LET coD = CREATE Company { name: "D", industry: "Construction" };
    
    CREATE Owns { owns: $coB, ownedBy: $coA, percentage: 50.00 };
    CREATE Owns { owns: $coC, ownedBy: $coB, percentage: 50.00 };
    CREATE Owns { owns: $coC, ownedBy: $coD, percentage: 50.00 };
    
    最后,我们可以定义一个权重计算器操作符,它可以有效地将沿路径的边权重相乘。在这里,我们将每条边的权重表示为1/百分比,然后在最后,我们再次翻转总和,这将为我们提供您想要的值

    CREATE WEIGHT CALCULATOR wcOwnership {
        minimum:    0,
        default:    0, 
        edges: {
            (:Company)-[ow:Owns]->(:Company): 1/ow.percentage
        }
    };
    
    “边”部分定义了要匹配的边模式以及要执行的计算,以计算该边的边权重。在InfiniteGraph中,边权重不必是属性;它可以是一个简单的属性,也可以是基于一个或多个对象的内容的复杂计算的结果

    对于给定的数据,我们可以使用权重计算器从目标公司(C)向上查询层次结构,对于发现的每个根,我们可以显示目标公司(C)、所有权百分比、路径长度和根公司的名称。这个特定的查询只能进行1到10度([*1..10]),但是这个数字可以根据需要进行扩展

      DO> Match m = max weight 1000.0 wcOwnership 
                        ((cTarget:Company {name == 'C'})-[*1..10]->(cRoot:Company)) 
                         return cTarget.name, 
                                1/Weight(m) as PercentageOwnership, 
                                Length(m), 
                                cRoot.name;
    
    {
      _Projection
      {
        cTarget.name:'C',
        PercentageOwnership:50.0000,
        Length(m):1,
        cRoot.name:'B'
      },
      _Projection
      {
        cTarget.name:'C',
        PercentageOwnership:50.0000,
        Length(m):1,
        cRoot.name:'D'
      },
      _Projection
      {
        cTarget.name:'C',
        PercentageOwnership:25.0000,
        Length(m):2,
        cRoot.name:'A'
      }
    }  
    
    此模型将捕获每个有问题公司的所有根节点

    #无限图形