Apache GraphAr C++ Library
The C++ Library for Apache GraphAr
graph_info.h
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the
7  * "License"); you may not use this file except in compliance
8  * with the License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing,
13  * software distributed under the License is distributed on an
14  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15  * KIND, either express or implied. See the License for the
16  * specific language governing permissions and limitations
17  * under the License.
18  */
19 
20 #pragma once
21 
22 #include <memory>
23 #include <string>
24 #include <unordered_map>
25 #include <vector>
26 
27 #include "graphar/fwd.h"
28 
29 namespace graphar {
30 
34 class Property {
35  public:
36  std::string name; // property name
37  std::shared_ptr<DataType> type; // property data type
38  bool is_primary; // primary key tag
39  bool is_nullable; // nullable tag for non-primary key
40  Cardinality
41  cardinality; // cardinality of the property, only use in vertex info
42 
43  Property() = default;
44 
45  explicit Property(const std::string& name,
46  const std::shared_ptr<DataType>& type = nullptr,
47  bool is_primary = false, bool is_nullable = true,
48  Cardinality cardinality = Cardinality::SINGLE)
49  : name(name),
50  type(type),
51  is_primary(is_primary),
52  is_nullable(!is_primary && is_nullable),
53  cardinality(cardinality) {}
54 };
55 
56 bool operator==(const Property& lhs, const Property& rhs);
57 
66  public:
76  explicit PropertyGroup(const std::vector<Property>& properties,
77  FileType file_type, const std::string& prefix = "");
78 
84  const std::vector<Property>& GetProperties() const;
85 
86  bool HasProperty(const std::string& property_name) const;
87 
92  inline FileType GetFileType() const { return file_type_; }
93 
98  inline const std::string& GetPrefix() const { return prefix_; }
99 
103  bool IsValidated() const;
104 
105  friend std::ostream& operator<<(std::ostream& stream,
106  const PropertyGroup& pg) {
107  for (size_t i = 0; i < pg.properties_.size(); ++i) {
108  stream << pg.properties_[i].name;
109  if (i != pg.properties_.size() - 1) {
110  stream << "_";
111  }
112  }
113  return stream;
114  }
115 
116  private:
117  std::vector<Property> properties_;
118  FileType file_type_;
119  std::string prefix_;
120 };
121 
122 bool operator==(const PropertyGroup& lhs, const PropertyGroup& rhs);
123 
128  public:
138  explicit AdjacentList(AdjListType type, FileType file_type,
139  const std::string& prefix = "");
140 
146  inline AdjListType GetType() const { return type_; }
147 
153  inline FileType GetFileType() const { return file_type_; }
154 
160  inline const std::string& GetPrefix() const { return prefix_; }
161 
167  bool IsValidated() const;
168 
169  private:
170  AdjListType type_;
171  FileType file_type_;
172  std::string prefix_;
173 };
174 
180 class VertexInfo {
181  public:
194  explicit VertexInfo(const std::string& type, IdType chunk_size,
195  const PropertyGroupVector& property_groups,
196  const std::vector<std::string>& labels = {},
197  const std::string& prefix = "",
198  std::shared_ptr<const InfoVersion> version = nullptr);
199 
200  ~VertexInfo();
201 
207  Result<std::shared_ptr<VertexInfo>> AddPropertyGroup(
208  std::shared_ptr<PropertyGroup> property_group) const;
209 
217  Result<std::shared_ptr<VertexInfo>> RemovePropertyGroup(
218  std::shared_ptr<PropertyGroup> property_group) const;
219 
225  const std::string& GetType() const;
226 
232  IdType GetChunkSize() const;
233 
239  const std::string& GetPrefix() const;
240 
246  const std::shared_ptr<const InfoVersion>& version() const;
247 
252  const std::vector<std::string>& GetLabels() const;
253 
259  int PropertyGroupNum() const;
260 
264  const PropertyGroupVector& GetPropertyGroups() const;
265 
272  std::shared_ptr<PropertyGroup> GetPropertyGroup(
273  const std::string& property_name) const;
274 
281  std::shared_ptr<PropertyGroup> GetPropertyGroupByIndex(int index) const;
282 
290  Result<std::shared_ptr<DataType>> GetPropertyType(
291  const std::string& property_name) const;
292 
293  Result<Cardinality> GetPropertyCardinality(
294  const std::string& property_name) const;
301  bool HasProperty(const std::string& property_name) const;
302 
309  Status Save(const std::string& file_name) const;
310 
317  Result<std::string> Dump() const noexcept;
318 
325  bool IsPrimaryKey(const std::string& property_name) const;
326 
333  bool IsNullableKey(const std::string& property_name) const;
334 
342  bool HasPropertyGroup(
343  const std::shared_ptr<PropertyGroup>& property_group) const;
344 
353  Result<std::string> GetFilePath(std::shared_ptr<PropertyGroup> property_group,
354  IdType chunk_index) const;
355 
363  Result<std::string> GetPathPrefix(
364  std::shared_ptr<PropertyGroup> property_group) const;
365 
371  Result<std::string> GetVerticesNumFilePath() const;
372 
378  bool IsValidated() const;
379 
387  static Result<std::shared_ptr<VertexInfo>> Load(std::shared_ptr<Yaml> yaml);
388 
395  static Result<std::shared_ptr<VertexInfo>> Load(const std::string& input);
396 
397  private:
398  class Impl;
399  std::unique_ptr<Impl> impl_;
400 };
401 
408 class EdgeInfo {
409  public:
427  explicit EdgeInfo(const std::string& src_type, const std::string& edge_type,
428  const std::string& dst_type, IdType chunk_size,
429  IdType src_chunk_size, IdType dst_chunk_size, bool directed,
430  const AdjacentListVector& adjacent_lists,
431  const PropertyGroupVector& property_groups,
432  const std::string& prefix = "",
433  std::shared_ptr<const InfoVersion> version = nullptr);
434 
435  ~EdgeInfo();
436 
444  Result<std::shared_ptr<EdgeInfo>> AddAdjacentList(
445  std::shared_ptr<AdjacentList> adj_list) const;
446 
454  Result<std::shared_ptr<EdgeInfo>> RemoveAdjacentList(
455  std::shared_ptr<AdjacentList> adj_list) const;
456 
462  Result<std::shared_ptr<EdgeInfo>> AddPropertyGroup(
463  std::shared_ptr<PropertyGroup> property_group) const;
464 
472  Result<std::shared_ptr<EdgeInfo>> RemovePropertyGroup(
473  std::shared_ptr<PropertyGroup> property_group) const;
474 
479  const std::string& GetSrcType() const;
480 
485  const std::string& GetEdgeType() const;
486 
491  const std::string& GetDstType() const;
492 
497  IdType GetChunkSize() const;
498 
503  IdType GetSrcChunkSize() const;
504 
509  IdType GetDstChunkSize() const;
510 
515  const std::string& GetPrefix() const;
516 
521  bool IsDirected() const;
522 
527  const std::shared_ptr<const InfoVersion>& version() const;
528 
536  bool HasAdjacentListType(AdjListType adj_list_type) const;
537 
544  bool HasProperty(const std::string& property_name) const;
545 
549  bool HasPropertyGroup(
550  const std::shared_ptr<PropertyGroup>& property_group) const;
551 
552  std::shared_ptr<AdjacentList> GetAdjacentList(
553  AdjListType adj_list_type) const;
554 
558  int PropertyGroupNum() const;
559 
564  const PropertyGroupVector& GetPropertyGroups() const;
565 
572  std::shared_ptr<PropertyGroup> GetPropertyGroup(
573  const std::string& property) const;
574 
581  std::shared_ptr<PropertyGroup> GetPropertyGroupByIndex(int index) const;
582 
590  Result<std::string> GetVerticesNumFilePath(AdjListType adj_list_type) const;
591 
600  Result<std::string> GetEdgesNumFilePath(IdType vertex_chunk_index,
601  AdjListType adj_list_type) const;
602 
610  Result<std::string> GetAdjListFilePath(IdType vertex_chunk_index,
611  IdType edge_chunk_index,
612  AdjListType adj_list_type) const;
613 
621  Result<std::string> GetAdjListPathPrefix(AdjListType adj_list_type) const;
622 
630  Result<std::string> GetAdjListOffsetFilePath(IdType vertex_chunk_index,
631  AdjListType adj_list_type) const;
632 
640  Result<std::string> GetOffsetPathPrefix(AdjListType adj_list_type) const;
641 
652  Result<std::string> GetPropertyFilePath(
653  const std::shared_ptr<PropertyGroup>& property_group,
654  AdjListType adj_list_type, IdType vertex_chunk_index,
655  IdType edge_chunk_index) const;
656 
665  Result<std::string> GetPropertyGroupPathPrefix(
666  const std::shared_ptr<PropertyGroup>& property_group,
667  AdjListType adj_list_type) const;
668 
676  Result<std::shared_ptr<DataType>> GetPropertyType(
677  const std::string& property_name) const;
684  bool IsPrimaryKey(const std::string& property_name) const;
685 
692  bool IsNullableKey(const std::string& property_name) const;
693 
700  Status Save(const std::string& file_name) const;
701 
708  Result<std::string> Dump() const noexcept;
709 
715  bool IsValidated() const;
716 
718  static Result<std::shared_ptr<EdgeInfo>> Load(std::shared_ptr<Yaml> yaml);
719 
726  static Result<std::shared_ptr<EdgeInfo>> Load(const std::string& input);
727 
728  private:
729  class Impl;
730  std::unique_ptr<Impl> impl_;
731 };
732 
736 class GraphInfo {
737  public:
749  explicit GraphInfo(
750  const std::string& graph_name, VertexInfoVector vertex_infos,
751  EdgeInfoVector edge_infos, const std::vector<std::string>& labels = {},
752  const std::string& prefix = "./",
753  std::shared_ptr<const InfoVersion> version = nullptr,
754  const std::unordered_map<std::string, std::string>& extra_info = {});
755 
756  ~GraphInfo();
757 
764  static Result<std::shared_ptr<GraphInfo>> Load(const std::string& path);
765 
773  static Result<std::shared_ptr<GraphInfo>> Load(
774  const std::string& input, const std::string& relative_path);
775 
784  Result<std::shared_ptr<GraphInfo>> AddVertex(
785  std::shared_ptr<VertexInfo> vertex_info) const;
786 
794  Result<std::shared_ptr<GraphInfo>> RemoveVertex(
795  std::shared_ptr<VertexInfo> vertex_info) const;
796 
805  Result<std::shared_ptr<GraphInfo>> AddEdge(
806  std::shared_ptr<EdgeInfo> edge_info) const;
807 
815  Result<std::shared_ptr<GraphInfo>> RemoveEdge(
816  std::shared_ptr<EdgeInfo> edge_info) const;
817 
822  const std::string& GetName() const;
823 
828  const std::vector<std::string>& GetLabels() const;
829 
834  const std::string& GetPrefix() const;
835 
841  const std::shared_ptr<const InfoVersion>& version() const;
842 
848  const std::unordered_map<std::string, std::string>& GetExtraInfo() const;
849 
855  std::shared_ptr<VertexInfo> GetVertexInfo(const std::string& type) const;
856 
865  std::shared_ptr<EdgeInfo> GetEdgeInfo(const std::string& src_type,
866  const std::string& edge_type,
867  const std::string& dst_type) const;
868 
872  int GetVertexInfoIndex(const std::string& type) const;
873 
878  int GetEdgeInfoIndex(const std::string& src_type,
879  const std::string& edge_type,
880  const std::string& dst_type) const;
881 
885  int VertexInfoNum() const;
886 
890  int EdgeInfoNum() const;
891 
898  const std::shared_ptr<VertexInfo> GetVertexInfoByIndex(int index) const;
899 
906  const std::shared_ptr<EdgeInfo> GetEdgeInfoByIndex(int index) const;
907 
913  const VertexInfoVector& GetVertexInfos() const;
914 
920  const EdgeInfoVector& GetEdgeInfos() const;
921 
928  Status Save(const std::string& path) const;
929 
936  Result<std::string> Dump() const;
937 
943  bool IsValidated() const;
944 
945  private:
946  class Impl;
947  std::unique_ptr<Impl> impl_;
948 };
949 
950 } // namespace graphar
const std::string & GetPrefix() const
Get the prefix of adjacent list.
Definition: graph_info.h:160
FileType GetFileType() const
Get the file type of adjacent list.
Definition: graph_info.h:153
AdjListType GetType() const
Get the type of adjacent list.
Definition: graph_info.h:146
bool IsValidated() const
Definition: graph_info.cc:191
AdjacentList(AdjListType type, FileType file_type, const std::string &prefix="")
Definition: graph_info.cc:183
EdgeInfo is a class to describe the edge information, including the source vertex type,...
Definition: graph_info.h:408
const std::string & GetEdgeType() const
Definition: graph_info.cc:694
static Result< std::shared_ptr< EdgeInfo > > Load(std::shared_ptr< Yaml > yaml)
Definition: graph_info.cc:966
Result< std::string > GetAdjListFilePath(IdType vertex_chunk_index, IdType edge_chunk_index, AdjListType adj_list_type) const
Get the file path of adj list topology chunk.
Definition: graph_info.cc:782
Status Save(const std::string &file_name) const
Definition: graph_info.cc:1107
Result< std::shared_ptr< EdgeInfo > > RemovePropertyGroup(std::shared_ptr< PropertyGroup > property_group) const
Removes a property group from the EdgeInfo instance and returns a new EdgeInfo.
Definition: graph_info.cc:925
Result< std::shared_ptr< DataType > > GetPropertyType(const std::string &property_name) const
Definition: graph_info.cc:843
bool IsValidated() const
Definition: graph_info.cc:947
const std::string & GetPrefix() const
Definition: graph_info.cc:704
Result< std::string > GetEdgesNumFilePath(IdType vertex_chunk_index, AdjListType adj_list_type) const
Definition: graph_info.cc:774
Result< std::string > GetPropertyGroupPathPrefix(const std::shared_ptr< PropertyGroup > &property_group, AdjListType adj_list_type) const
Definition: graph_info.cc:831
bool IsPrimaryKey(const std::string &property_name) const
Definition: graph_info.cc:852
Result< std::string > GetAdjListOffsetFilePath(IdType vertex_chunk_index, AdjListType adj_list_type) const
Get the adjacency list offset chunk file path of vertex chunk the offset chunks is aligned with the v...
Definition: graph_info.cc:800
IdType GetChunkSize() const
Definition: graph_info.cc:698
bool HasProperty(const std::string &property_name) const
Returns whether the edge info contains the given property.
Definition: graph_info.cc:717
Result< std::shared_ptr< EdgeInfo > > AddAdjacentList(std::shared_ptr< AdjacentList > adj_list) const
Definition: graph_info.cc:868
Result< std::shared_ptr< EdgeInfo > > RemoveAdjacentList(std::shared_ptr< AdjacentList > adj_list) const
Removes an adjacency list from the EdgeInfo instance and returns a new EdgeInfo.
Definition: graph_info.cc:884
Result< std::string > Dump() const noexcept
Definition: graph_info.cc:1052
bool IsNullableKey(const std::string &property_name) const
Definition: graph_info.cc:860
std::shared_ptr< PropertyGroup > GetPropertyGroupByIndex(int index) const
Get the property group at the specified index.
Definition: graph_info.cc:758
bool HasPropertyGroup(const std::shared_ptr< PropertyGroup > &property_group) const
Returns whether the edge info contains the given property group.
Definition: graph_info.cc:722
const std::shared_ptr< const InfoVersion > & version() const
Definition: graph_info.cc:708
Result< std::shared_ptr< EdgeInfo > > AddPropertyGroup(std::shared_ptr< PropertyGroup > property_group) const
Definition: graph_info.cc:906
const std::string & GetSrcType() const
Definition: graph_info.cc:692
bool HasAdjacentListType(AdjListType adj_list_type) const
Definition: graph_info.cc:712
Result< std::string > GetOffsetPathPrefix(AdjListType adj_list_type) const
Definition: graph_info.cc:808
bool IsDirected() const
Definition: graph_info.cc:706
Result< std::string > GetAdjListPathPrefix(AdjListType adj_list_type) const
Get the path prefix of the adjacency list topology chunk for the given adjacency list type.
Definition: graph_info.cc:792
EdgeInfo(const std::string &src_type, const std::string &edge_type, const std::string &dst_type, IdType chunk_size, IdType src_chunk_size, IdType dst_chunk_size, bool directed, const AdjacentListVector &adjacent_lists, const PropertyGroupVector &property_groups, const std::string &prefix="", std::shared_ptr< const InfoVersion > version=nullptr)
Construct an EdgeInfo object with the given information and property groups.
Definition: graph_info.cc:679
IdType GetDstChunkSize() const
Definition: graph_info.cc:702
Result< std::string > GetPropertyFilePath(const std::shared_ptr< PropertyGroup > &property_group, AdjListType adj_list_type, IdType vertex_chunk_index, IdType edge_chunk_index) const
Get the chunk file path of adj list property group the property group chunks is aligned with the adj ...
Definition: graph_info.cc:816
const std::string & GetDstType() const
Definition: graph_info.cc:696
IdType GetSrcChunkSize() const
Definition: graph_info.cc:700
const PropertyGroupVector & GetPropertyGroups() const
Get the property groups.
Definition: graph_info.cc:748
Result< std::string > GetVerticesNumFilePath(AdjListType adj_list_type) const
Get the file path for the number of vertices.
Definition: graph_info.cc:766
std::shared_ptr< PropertyGroup > GetPropertyGroup(const std::string &property) const
Get the property group containing the given property.
Definition: graph_info.cc:752
int PropertyGroupNum() const
Get the number of property groups.
Definition: graph_info.cc:744
int GetVertexInfoIndex(const std::string &type) const
Get the vertex info index with the given type.
Definition: graph_info.cc:1297
const EdgeInfoVector & GetEdgeInfos() const
Get the edge infos of graph info.
Definition: graph_info.cc:1342
GraphInfo(const std::string &graph_name, VertexInfoVector vertex_infos, EdgeInfoVector edge_infos, const std::vector< std::string > &labels={}, const std::string &prefix="./", std::shared_ptr< const InfoVersion > version=nullptr, const std::unordered_map< std::string, std::string > &extra_info={})
Constructs a GraphInfo instance.
Definition: graph_info.cc:1264
Status Save(const std::string &path) const
Definition: graph_info.cc:1496
const std::shared_ptr< VertexInfo > GetVertexInfoByIndex(int index) const
Get the vertex info at the specified index.
Definition: graph_info.cc:1323
Result< std::shared_ptr< GraphInfo > > AddVertex(std::shared_ptr< VertexInfo > vertex_info) const
Adds a vertex info to the GraphInfo instance and returns a new GraphInfo.
Definition: graph_info.cc:1348
const std::string & GetPrefix() const
Get the absolute path prefix of the chunk files.
Definition: graph_info.cc:1280
static Result< std::shared_ptr< GraphInfo > > Load(const std::string &path)
Loads the input file as a GraphInfo instance.
Definition: graph_info.cc:1420
bool IsValidated() const
Definition: graph_info.cc:1346
Result< std::string > Dump() const
Definition: graph_info.cc:1446
std::shared_ptr< EdgeInfo > GetEdgeInfo(const std::string &src_type, const std::string &edge_type, const std::string &dst_type) const
Get the edge info with the given source vertex type, edge type, and destination vertex type.
Definition: graph_info.cc:1301
int EdgeInfoNum() const
Get the number of edge infos.
Definition: graph_info.cc:1319
std::shared_ptr< VertexInfo > GetVertexInfo(const std::string &type) const
Get the vertex info with the given type.
Definition: graph_info.cc:1291
const std::vector< std::string > & GetLabels() const
Get the vertex labels of the graph.
Definition: graph_info.cc:1276
Result< std::shared_ptr< GraphInfo > > AddEdge(std::shared_ptr< EdgeInfo > edge_info) const
Adds an edge info to the GraphInfo instance and returns a new GraphInfo.
Definition: graph_info.cc:1377
const VertexInfoVector & GetVertexInfos() const
Get the vertex infos of graph info.
Definition: graph_info.cc:1338
const std::unordered_map< std::string, std::string > & GetExtraInfo() const
Get the extra metadata of the graph info object.
Definition: graph_info.cc:1286
int GetEdgeInfoIndex(const std::string &src_type, const std::string &edge_type, const std::string &dst_type) const
Get the edge info index with the given source vertex type, edge type, and destination type.
Definition: graph_info.cc:1308
int VertexInfoNum() const
Get the number of vertex infos.
Definition: graph_info.cc:1315
const std::string & GetName() const
Get the name of the graph.
Definition: graph_info.cc:1274
Result< std::shared_ptr< GraphInfo > > RemoveEdge(std::shared_ptr< EdgeInfo > edge_info) const
Removes an edge info from the GraphInfo instance and returns a new GraphInfo.
Definition: graph_info.cc:1392
Result< std::shared_ptr< GraphInfo > > RemoveVertex(std::shared_ptr< VertexInfo > vertex_info) const
Removes a vertex info from the GraphInfo instance and returns a new GraphInfo.
Definition: graph_info.cc:1361
const std::shared_ptr< const InfoVersion > & version() const
Get the version info of the graph info object.
Definition: graph_info.cc:1282
const std::shared_ptr< EdgeInfo > GetEdgeInfoByIndex(int index) const
Get the edge info at the specified index.
Definition: graph_info.cc:1331
const std::string & GetPrefix() const
Definition: graph_info.h:98
bool IsValidated() const
Definition: graph_info.cc:133
FileType GetFileType() const
Definition: graph_info.h:92
PropertyGroup(const std::vector< Property > &properties, FileType file_type, const std::string &prefix="")
Definition: graph_info.cc:109
const std::vector< Property > & GetProperties() const
Definition: graph_info.cc:120
Status outcome object (success or error)
Definition: status.h:123
VertexInfo is a class to describe the vertex information, including the vertex type,...
Definition: graph_info.h:180
const std::string & GetType() const
Definition: graph_info.cc:290
std::shared_ptr< PropertyGroup > GetPropertyGroup(const std::string &property_name) const
Definition: graph_info.cc:329
Result< std::string > GetPathPrefix(std::shared_ptr< PropertyGroup > property_group) const
Definition: graph_info.cc:313
const std::vector< std::string > & GetLabels() const
Definition: graph_info.cc:296
IdType GetChunkSize() const
Definition: graph_info.cc:292
const std::shared_ptr< const InfoVersion > & version() const
Definition: graph_info.cc:300
Result< std::shared_ptr< VertexInfo > > AddPropertyGroup(std::shared_ptr< PropertyGroup > property_group) const
Definition: graph_info.cc:399
bool HasProperty(const std::string &property_name) const
Definition: graph_info.cc:363
bool HasPropertyGroup(const std::shared_ptr< PropertyGroup > &property_group) const
Definition: graph_info.cc:368
Result< std::string > GetFilePath(std::shared_ptr< PropertyGroup > property_group, IdType chunk_index) const
Definition: graph_info.cc:304
bool IsPrimaryKey(const std::string &property_name) const
Definition: graph_info.cc:347
bool IsValidated() const
Definition: graph_info.cc:437
int PropertyGroupNum() const
Definition: graph_info.cc:325
Result< std::shared_ptr< VertexInfo > > RemovePropertyGroup(std::shared_ptr< PropertyGroup > property_group) const
Removes a property group from the VertexInfo instance and returns a new VertexInfo.
Definition: graph_info.cc:416
const std::string & GetPrefix() const
Definition: graph_info.cc:294
Result< std::string > GetVerticesNumFilePath() const
Definition: graph_info.cc:321
Result< std::shared_ptr< DataType > > GetPropertyType(const std::string &property_name) const
Definition: graph_info.cc:381
VertexInfo(const std::string &type, IdType chunk_size, const PropertyGroupVector &property_groups, const std::vector< std::string > &labels={}, const std::string &prefix="", std::shared_ptr< const InfoVersion > version=nullptr)
Definition: graph_info.cc:280
bool IsNullableKey(const std::string &property_name) const
Definition: graph_info.cc:355
Result< std::string > Dump() const noexcept
Definition: graph_info.cc:518
static Result< std::shared_ptr< VertexInfo > > Load(std::shared_ptr< Yaml > yaml)
Definition: graph_info.cc:451
std::shared_ptr< PropertyGroup > GetPropertyGroupByIndex(int index) const
Definition: graph_info.cc:335
Status Save(const std::string &file_name) const
Definition: graph_info.cc:566
const PropertyGroupVector & GetPropertyGroups() const
Definition: graph_info.cc:343