Hi, Here's an example: Imaging your subgraph (let's call it sub. save it in a file called sub.gml) looks like this in .gml format: graph [ directed 1 node [ id 0 name "a" status "down" ] node [ id 1 name "b" status "up" ] ] And your larger graph (let's call it g. save it in a file called g.gml) looks like this: graph [ directed 1 node [ id 0 name "a" status "up" ] node [ id 1 name "b" status "up" ] node [ id 0 name "a" status "down" ] node [ id 1 name "b" status "up" ] node [ id 4 name "c" status "down" ] ] When you load your graphs, the properties load in the graphs' property maps (you can retrieve them with g.vertex_properties['status'] for example). Here's 2 ways you can find subgraphs that are isomorphic: vertex_mapping_name, edge_mapping_name=gt.subgraph_isomorphism(sub, g, vertex_label=(sub.vertex_properties["name"],g.vertex_properties["name"]),random=True) vertex_mapping_status, edge_mapping_status=gt.subgraph_isomorphism(sub, g, vertex_label=(sub.vertex_properties["status"],g.vertex_properties["status"]),random=True) If I have multiple criteria, I perform an intersection of sorts after the fact. I'm not sure if there's a better way to use different labels at the same time. I've pasted the python code below. Hope that helps! Reem import graph_tool.all as gt g = gt.load_graph("./g.gml") sub = gt.load_graph("./sub.gml") vertex_mapping_name, edge_mapping_name=gt.subgraph_isomorphism(sub, g, vertex_label=(sub.vertex_properties["name"],g.vertex_properties["name"]),random=True) vertex_mapping_status, edge_mapping_status=gt.subgraph_isomorphism(sub, g, vertex_label=(sub.vertex_properties["status"],g.vertex_properties["status"]),random=True) print(len(vertex_mapping_name)) print(len(vertex_mapping_status)) -- View this message in context: http://main-discussion-list-for-the-graph-tool-project.982480.n3.nabble.com/... Sent from the Main discussion list for the graph-tool project mailing list archive at Nabble.com.