Php 从V(1)匹配V(任意)属性的所有顶点添加边
我正在将MySql中的一个现有数据集导入Gremlin服务器,并且我在努力导入MySql数据库中存储了一种特定的关系模式 该模式的一个示例如下:我们有Php 从V(1)匹配V(任意)属性的所有顶点添加边,php,mysql,gremlin,Php,Mysql,Gremlin,我正在将MySql中的一个现有数据集导入Gremlin服务器,并且我在努力导入MySql数据库中存储了一种特定的关系模式 该模式的一个示例如下:我们有学生,教师,以及报告。为简单起见,架构如下所示: +------------+--------------+ | student_id | student_name | +------------+--------------+ | 1 | Albert | +------------+--------------+
学生
,教师
,以及报告
。为简单起见,架构如下所示:
+------------+--------------+
| 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最佳实践(我们进行此迁移的部分原因),因此一直在执行数据导入。目前,其运行模式为:
\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')