imbajin commented on code in PR #683:
URL:
https://github.com/apache/incubator-hugegraph-toolchain/pull/683#discussion_r2458903120
##########
hugegraph-loader/src/main/java/org/apache/hugegraph/loader/HugeGraphLoader.java:
##########
@@ -153,11 +270,286 @@ private void createSchema() {
throw new LoadException("Failed to read schema file '%s'", e,
options.schema);
}
- groovyExecutor.execute(script, client);
+
+ if (!options.shorterIDConfigs.isEmpty()) {
+ for (ShortIdConfig config : options.shorterIDConfigs) {
+ PropertyKey propertyKey =
client.schema().propertyKey(config.getIdFieldName())
+ .ifNotExist()
+
.dataType(config.getIdFieldType())
+ .build();
+ client.schema().addPropertyKey(propertyKey);
+ }
+ groovyExecutor.execute(script, client);
+ List<VertexLabel> vertexLabels =
client.schema().getVertexLabels();
+ for (VertexLabel vertexLabel : vertexLabels) {
+ ShortIdConfig config;
+ if ((config =
options.getShortIdConfig(vertexLabel.name())) != null) {
+ config.setLabelID(vertexLabel.id());
+ IndexLabel indexLabel = client.schema()
+
.indexLabel(config.getVertexLabel() + "By" +
+
config.getIdFieldName())
+
.onV(config.getVertexLabel())
+
.by(config.getIdFieldName())
+ .secondary()
+ .ifNotExist()
+ .build();
+ client.schema().addIndexLabel(indexLabel);
+ }
+ }
+ } else {
+ groovyExecutor.execute(script, client);
+ }
+ }
+
+ // create schema for Graph Source
+ List<InputStruct> structs = this.mapping.structs();
+ for (InputStruct struct : structs) {
+ if (SourceType.GRAPH.equals(struct.input().type())) {
+ GraphSource graphSouce = (GraphSource) struct.input();
+ if (StringUtils.isEmpty(graphSouce.getPdPeers())) {
+ graphSouce.setPdPeers(this.options.pdPeers);
+ }
+ if (StringUtils.isEmpty(graphSouce.getMetaEndPoints())) {
+ graphSouce.setMetaEndPoints(this.options.metaEndPoints);
+ }
+ if (StringUtils.isEmpty(graphSouce.getCluster())) {
+ graphSouce.setCluster(this.options.cluster);
+ }
+ if (StringUtils.isEmpty(graphSouce.getUsername())) {
+ graphSouce.setUsername(this.options.username);
+ }
+ if (StringUtils.isEmpty(graphSouce.getPassword())) {
+ graphSouce.setPassword(this.options.password);
+ }
+
+ GraphSource graphSource = (GraphSource) struct.input();
+ createGraphSourceSchema(graphSource);
+ }
}
+
this.context.updateSchemaCache();
}
+ /**
+ * create schema like graphdb when source is graphdb;
+ *
+ * @param graphSource
+ */
+ private void createGraphSourceSchema(GraphSource graphSource) {
+
+ try (HugeClient sourceClient = graphSource.createHugeClient();
+ HugeClient client = HugeClientHolder.create(this.options, false))
{
+
+ createGraphSourceVertexLabel(sourceClient, client, graphSource);
+ createGraphSourceEdgeLabel(sourceClient, client, graphSource);
+ createGraphSourceIndexLabel(sourceClient, client, graphSource);
+ }
+ }
+
+ private void createGraphSourceVertexLabel(HugeClient sourceClient,
+ HugeClient targetClient,
+ GraphSource graphSource) {
+
+ sourceClient.assignGraph(graphSource.getGraphSpace(),
+ graphSource.getGraph());
+
+ // Create Vertex Schema
+ List<VertexLabel> vertexLabels = new ArrayList<>();
+ if (graphSource.getSelectedVertices() != null) {
+ List<String> selectedVertexLabels =
+ graphSource.getSelectedVertices()
+ .stream().map((des) -> des.getLabel())
+ .collect(Collectors.toList());
+
+ if (!CollectionUtils.isEmpty(selectedVertexLabels)) {
+ vertexLabels =
+ sourceClient.schema()
+ .getVertexLabels(selectedVertexLabels);
+ }
+ } else {
+ vertexLabels = sourceClient.schema().getVertexLabels();
+ }
+
+ Map<String, GraphSource.SeletedLabelDes> mapSelectedVertices
+ = new HashMap<>();
+ if (graphSource.getSelectedVertices() != null) {
+ for (GraphSource.SeletedLabelDes des :
+ graphSource.getSelectedVertices()) {
+ mapSelectedVertices.put(des.getLabel(), des);
+ }
+ }
+
+ for (VertexLabel label : vertexLabels) {
+ if (mapSelectedVertices.getOrDefault(label.name(),
+ null) != null) {
+ List<String> selectedProperties = mapSelectedVertices.get(
+ label.name()).getProperties();
+
+ if (selectedProperties != null) {
+ label.properties().clear();
+ label.properties().addAll(selectedProperties);
+ }
+ }
+ }
+
+ Map<String, GraphSource.IgnoredLabelDes> mapIgnoredVertices
+ = new HashMap<>();
+ if (graphSource.getIgnoredVertices() != null) {
+ for (GraphSource.IgnoredLabelDes des :
+ graphSource.getIgnoredVertices()) {
+ mapIgnoredVertices.put(des.getLabel(), des);
+ }
+ }
+
+ for (VertexLabel vertexLabel : vertexLabels) {
+ if (mapIgnoredVertices.containsKey(vertexLabel.name())) {
+ GraphSource.IgnoredLabelDes des
+ = mapIgnoredVertices.get(vertexLabel.name());
+
+ if (des.getProperties() != null) {
+ des.getProperties()
+ .forEach((p) -> vertexLabel.properties().remove(p));
+ }
+ }
+
+ Set<String> existedPKs =
+ targetClient.schema().getPropertyKeys().stream()
+ .map(pk ->
pk.name()).collect(Collectors.toSet());
+
+ for (String pkName : vertexLabel.properties()) {
+ PropertyKey pk = sourceClient.schema()
+ .getPropertyKey(pkName);
+ if (!existedPKs.contains(pk.name())) {
+ targetClient.schema().addPropertyKey(pk);
+ }
Review Comment:
⚠️ **Schema 创建缺少事务性**: GraphSource 的 schema 创建过程(PropertyKey -> VertexLabel
-> EdgeLabel -> IndexLabel)在失败时可能导致部分 schema 已创建的不一致状态。
**建议**:
1. 添加回滚机制或幂等性检查
2. 在 schema 创建前检查是否已存在
3. 考虑使用事务或原子操作
```java
// 添加幂等性检查
Set<String> existingPKs = targetClient.schema().getPropertyKeys()
.stream().map(PropertyKey::name)
.collect(Collectors.toSet());
if (!existingPKs.contains(pk.name())) {
targetClient.schema().addPropertyKey(pk);
}
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]