我正在尝试使用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;
}
答案 0 :(得分:0)
好吧,我找到了一个简单的解决方案:修改graphml.cc代码,并将节点的id视为属性。意思是:
run
中的可能节点属性中添加“ id”:
m_keys["id"] = node_key;
m_key_type["id"] = "string";
m_key_name["id"] = "id";
handle_vertex
中找到新节点后, handle_node_property("id", v, v);