boost read_graphml 丢弃节点的 id
boost read_graphml discards the nodes' id
我正在尝试使用 BGL 库读取 graphml 文件。我可以成功读取文件并收集链接到每个节点的属性。
但是,我的 graphml 文件中的节点条目也有一个我想检索的重要 ID。最好的办法是能够将此字符串 id 用作节点索引,但这可能无法实现,因为这会进一步限制 VertexList 而不是作为容器。因此,至少,我希望保留 id 信息并能够访问它。之后立即编写图表时,节点 ID 被 "n0"、"n1"、... 所取代,这暗示我认为 boost 不会保留节点 ID 信息。真的是这样吗?我错过了什么吗?
下面是我使用的代码:
struct VertexProperty
{
std::string name ;
};
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, VertexProperty, boost::no_property> Graph;
int main(){
std::ifstream inFile;
inFile.open("in.graphml", std::ifstream::in);
if(!inFile.good()){
std::cout << "could not open file" << std::endl;
return 1;
}
Graph g;
boost::dynamic_properties dp(boost::ignore_other_properties);
dp.property("name", boost::get(&VertexProperty::name, g));
boost::read_graphml(inFile, g, dp);
std::cout << boost::num_vertices(g) << std::endl;
std::cout << g[0].name << std::endl; // I can access the node indexed by 0 properties like this
std::cout << get(&VertexProperty::name, g, 0) << std::endl; // I can retrieve a property value like that as well
std::cout << get(boost::vertex_index, g, 0) << std::endl; // doesn't give me the node id unfortunately
std::ofstream out("out.graphml", std::ofstream::out);
boost::write_graphml(out, g, dp);
return 0;
}
好的,我找到了一个足够简单的解决方案:修改 graphml.cc 代码,并将节点的 ID 视为 属性。这意味着:
- 将"id"添加到
run
中可能的节点属性:
m_keys["id"] = node_key;
m_key_type["id"] = "string";
m_key_name["id"] = "id";
- 当在
handle_vertex
中找到新节点时,将节点的 id 添加到动态属性中
handle_node_property("id", v, v);
我正在尝试使用 BGL 库读取 graphml 文件。我可以成功读取文件并收集链接到每个节点的属性。
但是,我的 graphml 文件中的节点条目也有一个我想检索的重要 ID。最好的办法是能够将此字符串 id 用作节点索引,但这可能无法实现,因为这会进一步限制 VertexList 而不是作为容器。因此,至少,我希望保留 id 信息并能够访问它。之后立即编写图表时,节点 ID 被 "n0"、"n1"、... 所取代,这暗示我认为 boost 不会保留节点 ID 信息。真的是这样吗?我错过了什么吗?
下面是我使用的代码:
struct VertexProperty
{
std::string name ;
};
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, VertexProperty, boost::no_property> Graph;
int main(){
std::ifstream inFile;
inFile.open("in.graphml", std::ifstream::in);
if(!inFile.good()){
std::cout << "could not open file" << std::endl;
return 1;
}
Graph g;
boost::dynamic_properties dp(boost::ignore_other_properties);
dp.property("name", boost::get(&VertexProperty::name, g));
boost::read_graphml(inFile, g, dp);
std::cout << boost::num_vertices(g) << std::endl;
std::cout << g[0].name << std::endl; // I can access the node indexed by 0 properties like this
std::cout << get(&VertexProperty::name, g, 0) << std::endl; // I can retrieve a property value like that as well
std::cout << get(boost::vertex_index, g, 0) << std::endl; // doesn't give me the node id unfortunately
std::ofstream out("out.graphml", std::ofstream::out);
boost::write_graphml(out, g, dp);
return 0;
}
好的,我找到了一个足够简单的解决方案:修改 graphml.cc 代码,并将节点的 ID 视为 属性。这意味着:
- 将"id"添加到
run
中可能的节点属性:
m_keys["id"] = node_key;
m_key_type["id"] = "string";
m_key_name["id"] = "id";
- 当在
handle_vertex
中找到新节点时,将节点的 id 添加到动态属性中
handle_node_property("id", v, v);