Я пытаюсь прочитать файл GraphML с помощью библиотеки BGL. Я могу успешно прочитать файл и собирает свойства, связанные с каждым узлом.
Однако записи узла в моем файле graphml также имеют нетривиальный идентификатор, который я хотел бы получить. Лучше всего было бы использовать эту строковый идентификатор в качестве индекса узла, но это может быть недостижимо из-за того факта, что будет накладывать ограничение на VertexList дальше, чем на контейнер. Поэтому, по крайней мере, я хотел бы, чтобы информация об идентификаторе была сохранена и чтобы я мог получить к ней доступ. При написании графика сразу после этого идентификаторы узлов заменяются на «n0», «n1», … что наводит меня на мысль, что boost не хранит информацию об идентификаторе узла. Это действительно так? Я что-то пропустил?
Ниже приведен код, который я использую:
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 и обработал идентификатор узла как свойство. Что значит:
run
:
m_keys["id"] = node_key;
m_key_type["id"] = "string";
m_key_name["id"] = "id";
handle_vertex
handle_node_property("id", v, v);
Других решений пока нет …