Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.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/mysql/70.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
Php 从V(1)匹配V(任意)属性的所有顶点添加边_Php_Mysql_Gremlin - Fatal编程技术网

Php 从V(1)匹配V(任意)属性的所有顶点添加边

Php 从V(1)匹配V(任意)属性的所有顶点添加边,php,mysql,gremlin,Php,Mysql,Gremlin,我正在将MySql中的一个现有数据集导入Gremlin服务器,并且我在努力导入MySql数据库中存储了一种特定的关系模式 该模式的一个示例如下:我们有学生,教师,以及报告。为简单起见,架构如下所示: +------------+--------------+ | student_id | student_name | +------------+--------------+ | 1 | Albert | +------------+--------------+

我正在将MySql中的一个现有数据集导入Gremlin服务器,并且我在努力导入MySql数据库中存储了一种特定的关系模式

该模式的一个示例如下:我们有
学生
教师
,以及
报告
。为简单起见,架构如下所示:

+------------+--------------+
| student_id | student_name |
+------------+--------------+
| 1          | Albert       |
+------------+--------------+

+------------+--------------+
| teacher_id | teacher_name |
+------------+--------------+
| 1          | Bartolo      |
+------------+--------------+

+------------+--------------+----------------+------------------+
| report_id  | report_name  | requester_type | requester_forid  |
+------------+--------------+----------------+------------------+
| 1          | grade_lookup | student        | 1                |
+------------+--------------+----------------+------------------+
| 2          | attendees    | teacher        | 1                |
+------------+--------------+----------------+------------------+
我完全理解这是糟糕的MySQL最佳实践(我们进行此迁移的部分原因),因此一直在执行数据导入。目前,其运行模式为:

  • 将所有“报告”作为顶点导入Gremlin,并将字段名映射到PHP循环中的属性
  • 对每个教师和学生表执行相同的操作

  • 对请求者信息运行MySQL连接,从“Reports”表中查找按类分组的链接值

  • 这种模式适用于少量记录,在这些记录中,我将能够有一组小的、定义良好的交互。但是,由于报告记录的顶点已经包含了它们的链接信息,我想知道是否有一种方法可以简化这个过程。我理想的工作流程如下:

  • 导入所有顶点
  • 对于任何属性匹配的
    \u type
    ,向顶点添加一条输出边,该边将“type”字段的标签与“id”属性相匹配
  • 我在这里的尝试是

    g.V().has('requester_type').values('requester_type').store('rt')
    .sideEffect(V().has('rt')).addE('is_fortype').from('rt')
    

    但这增加了所有“requester_type”的边缘,并没有做我需要它做的过滤。有没有更好的方法来解决这个问题?我可以使用我的框架在一个循环中运行许多upsert edge函数,或者我可以在属性与属性匹配的地方插入边,使用每个参数的属性通知连接及其方向。

    对于加载数据,我通常建议您将源数据放入表单中,而不要将您置于必须尝试这样做的情况下在顶点上“连接”以构建边。迭代
    V()
    以构建这些连接的成本对于最小的图形以外的任何图形都是昂贵的,除非有适当的索引。当然,仅用于此目的的索引字段似乎“错了”“因为它创建的索引在负载之外没有实质价值。在某些图表上,它甚至可能会以资源和加载时间为代价

    在第一种方法中,将负载减少到“加载所有顶点”和“加载所有边”对我来说似乎很好。如果这是一次从头开始的批量加载,我不确定为什么需要使用
    coalesce()
    。如果您试图消除的数据中存在重复项,那么我会在查询源数据时这样做,并避免出现这种情况。取消现有的边缘检查应该可以提高加载速度

    如果为顶点添加一个全局唯一标识符,而不是尝试使用整数进行边加载,则可能会使边加载更加通用和容易。这样,加载边的逻辑就更加直接,在加载边时,不需要代码对顶点标签进行推理。然后,您还可以对数据进行预排序,然后构建Gremlin以批量加载单个顶点周围的边,这将有助于避免反复查找同一个顶点


    最后,我假设您使用的PHP驱动程序允许您使用Gremlin脚本。我强烈建议您调整代码以利用该特性。这将极大地提高性能。

    感谢您抽出时间回答:我已经能够在我的框架一侧进行优化,让这成为正确的答案。
    $query = "
    SELECT report_id, requester_type, requester_forid 
    FROM report 
    WHERE requester_type = 'student' 
    JOIN student ON requester_forid = requester_type;
    ";
    $rows = mysqli_query($query);
    foreach($rows as $row){
       # Upsert Gremlin Edge between the objects by coalescing the vertices
       $gremlin->send("
            g.V().has('Report', 'report_id', '". $row['report_id'] ."').as('fromRecord').
            V().has('Student', student_id, ".$row['requester_forid'].").
               coalesce(__.inE('report_for_student').where(outV().as('fromRecord')),
                        addE('report_for_student').from('fromRecord')
       ");
    }
    
    g.V().has('requester_type').values('requester_type').store('rt')
    .sideEffect(V().has('rt')).addE('is_fortype').from('rt')