boost read_graphml отбрасывает идентификатор узла - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь прочитать файл 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;
}

1 Ответ

0 голосов
/ 05 декабря 2018

Хорошо. Я нашел достаточно простое решение: измените код graphml.cc и обработайте идентификатор узла как свойство. Что означает:

  • добавить "id" к возможным свойствам узла в run:

m_keys["id"] = node_key; m_key_type["id"] = "string"; m_key_name["id"] = "id";

  • добавляет идентификатор узла к динамическим свойствам, когда в handle_vertex* 1013 обнаружен новый узел

handle_node_property("id", v, v);

...