Skip to content

Commit

Permalink
refine schema definition
Browse files Browse the repository at this point in the history
todo: change repo back
  • Loading branch information
zhanglei1949 committed Aug 28, 2023
1 parent f71a08d commit 645fbfa
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 42 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/flex.yml
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ jobs:
# remove modern graph indices
rm -rf /tmp/csr-data-dir/
git clone -b master --single-branch --depth=1 https://github.com/GraphScope/gstest.git ${GS_TEST_DIR}
git clone -b master --single-branch --depth=1 https://github.com/zhanglei1949/gstest.git ${GS_TEST_DIR}
cd ${GITHUB_WORKSPACE}/flex/build/
SCHEMA_FILE=${FLEX_DATA_DIR}/audit_graph_schema.yaml
Expand Down
24 changes: 14 additions & 10 deletions flex/storages/rt_mutable_graph/modern_graph/modern_graph.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ stored_procedures:
- ldbc_ic1
schema:
vertex_types:
- type_name: person
- type_id: 0
type_name: person
x_csr_params:
max_vertex_num: 100
properties:
Expand All @@ -24,7 +25,8 @@ schema:
primitive_type: DT_SIGNED_INT32
primary_keys:
- id
- type_name: software
- type_id: 1
type_name: software
x_csr_params:
max_vertex_num: 100
properties:
Expand All @@ -44,27 +46,29 @@ schema:
primary_keys:
- id
edge_types:
- type_name: knows
- type_id: 0
type_name: knows
x_csr_params:
incoming_edge_strategy: Multiple
outgoing_edge_strategy: Multiple
vertex_type_pair_relations:
source_vertex: person
destination_vertex: person
relation: MANY_TO_MANY
- source_vertex: person
destination_vertex: person
relation: MANY_TO_MANY
properties:
- property_id: 0
property_name: weight
property_type:
primitive_type: DT_DOUBLE
- type_name: created
- type_id: 1
type_name: created
x_csr_params:
incoming_edge_strategy: Multiple
outgoing_edge_strategy: Single
vertex_type_pair_relations:
source_vertex: person
destination_vertex: software
relation: ONE_TO_MANY
- source_vertex: person
destination_vertex: software
relation: ONE_TO_MANY
properties:
- property_id: 0
property_name: weight
Expand Down
94 changes: 63 additions & 31 deletions flex/storages/rt_mutable_graph/schema.cc
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,17 @@ static bool parse_vertex_schema(YAML::Node node, Schema& schema) {

schema.add_vertex_label(label_name, property_types, property_names,
primary_keys, strategies, max_num);
// check the type_id equals to storage's label_id
int32_t type_id;
if (!get_scalar(node, "type_id", type_id)) {
LOG(ERROR) << "type_id is not set properly for type: " << label_name;
return false;
}
auto label_id = schema.get_vertex_label_id(label_name);
if (label_id != type_id) {
LOG(ERROR) << "type_id is not equal to label_id for type: " << label_name;
return false;
}
return true;
}

Expand All @@ -557,37 +568,12 @@ static bool parse_vertices_schema(YAML::Node node, Schema& schema) {
}

static bool parse_edge_schema(YAML::Node node, Schema& schema) {
std::string src_label_name, dst_label_name, edge_label_name;
std::string edge_label_name;
if (!node["type_name"]) {
LOG(ERROR) << "edge type_name is not set properly";
return false;
}
edge_label_name = node["type_name"].as<std::string>();
// get vertex type pair relation
auto vertex_type_pair_node = node["vertex_type_pair_relations"];
if (!vertex_type_pair_node || !vertex_type_pair_node.IsMap()) {
LOG(ERROR) << "edge [vertex_type_pair_relations] is not set properly";
return false;
}

if (!get_scalar(vertex_type_pair_node, "source_vertex", src_label_name)) {
LOG(ERROR) << "Expect field source_vertex for edge [" << edge_label_name
<< "] in vertex_type_pair_relations";
return false;
}
if (!get_scalar(vertex_type_pair_node, "destination_vertex",
dst_label_name)) {
LOG(ERROR) << "Expect field destination_vertex for edge ["
<< edge_label_name << "] in vertex_type_pair_relations";
return false;
}

// check whether edge triplet exists in current schema
if (schema.has_edge_label(src_label_name, dst_label_name, edge_label_name)) {
LOG(ERROR) << "Edge [" << edge_label_name << "] from [" << src_label_name
<< "] to [" << dst_label_name << "] already exists";
return false;
}

std::vector<PropertyType> property_types;
std::vector<std::string> prop_names;
Expand All @@ -607,11 +593,57 @@ static bool parse_edge_schema(YAML::Node node, Schema& schema) {
ie = StringToEdgeStrategy(ie_str);
}
}
VLOG(10) << "edge " << edge_label_name << " from " << src_label_name << " to "
<< dst_label_name << " with " << property_types.size()
<< " properties";
schema.add_edge_label(src_label_name, dst_label_name, edge_label_name,
property_types, prop_names, oe, ie);

// get vertex type pair relation
auto vertex_type_pair_node = node["vertex_type_pair_relations"];
// vertex_type_pair_node can be a list or a map
if (!vertex_type_pair_node) {
LOG(ERROR) << "edge [vertex_type_pair_relations] is not set";
return false;
}
if (!vertex_type_pair_node.IsSequence()) {
LOG(ERROR) << "edge [vertex_type_pair_relations] should be a sequence";
return false;
}
for (auto i = 0; i < vertex_type_pair_node.size(); ++i) {
std::string src_label_name, dst_label_name;
auto cur_node = vertex_type_pair_node[i];
if (!get_scalar(cur_node, "source_vertex", src_label_name)) {
LOG(ERROR) << "Expect field source_vertex for edge [" << edge_label_name
<< "] in vertex_type_pair_relations";
return false;
}
if (!get_scalar(cur_node, "destination_vertex", dst_label_name)) {
LOG(ERROR) << "Expect field destination_vertex for edge ["
<< edge_label_name << "] in vertex_type_pair_relations";
return false;
}
// check whether edge triplet exists in current schema
if (schema.has_edge_label(src_label_name, dst_label_name,
edge_label_name)) {
LOG(ERROR) << "Edge [" << edge_label_name << "] from [" << src_label_name
<< "] to [" << dst_label_name << "] already exists";
return false;
}
VLOG(10) << "edge " << edge_label_name << " from " << src_label_name
<< " to " << dst_label_name << " with " << property_types.size()
<< " properties";
schema.add_edge_label(src_label_name, dst_label_name, edge_label_name,
property_types, prop_names, oe, ie);
}

// check the type_id equals to storage's label_id
int32_t type_id;
if (!get_scalar(node, "type_id", type_id)) {
LOG(ERROR) << "type_id is not set properly for type: " << edge_label_name;
return false;
}
auto label_id = schema.get_edge_label_id(edge_label_name);
if (label_id != type_id) {
LOG(ERROR) << "type_id is not equal to label_id for type: "
<< edge_label_name;
return false;
}
return true;
}

Expand Down

0 comments on commit 645fbfa

Please sign in to comment.