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);