boost read_graphml丢弃节点的ID

时间:2018-11-16 18:09:48

标签: c++ boost graphml

我正在尝试使用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;
}

1 个答案:

答案 0 :(得分:0)

好吧,我找到了一个简单的解决方案:修改graphml.cc代码,并将节点的id视为属性。意思是:

  • run中的可能节点属性中添加“ id”:

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

    handle_vertex中找到新节点后,
  • 将节点的ID添加到动态属性中

handle_node_property("id", v, v);