/// set RESULT into set of instances of A such that they do have data roles R and S void ReasoningKernel :: getDataRelatedIndividuals ( TDRoleExpr* R, TDRoleExpr* S, int op, IndividualSet& Result ) { preprocessKB(); // ensure KB is ready to answer the query Result.clear(); const TRole* r = getRole ( R, "Role expression expected in the getDataRelatedIndividuals()" ); const TRole* s = getRole ( S, "Role expression expected in the getDataRelatedIndividuals()" ); // prepare DT reasoners const DLDag& dag = getTBox()->getDag(); const DataTypeCenter& dtc = getTBox()->getDataTypeCenter(); DataTypeReasoner Op1(dag); DataTypeReasoner Op2(dag); dtc.initDataTypeReasoner(Op1); dtc.initDataTypeReasoner(Op2); // vector of individuals typedef TDLNAryExpression<TDLIndividualExpression> IndVec; IndVec Individuals ("individual expression","data related individuals"); Individuals.add(getExpressionManager()->getArgList()); for ( IndVec::iterator q = Individuals.begin(), q_end = Individuals.end(); q != q_end; ++q ) { const TIndividual* ind = getIndividual ( *q, "individual name expected in getDataRelatedIndividuals()" ); const DlCompletionTree* vR = NULL; const DlCompletionTree* vS = NULL; for ( DlCompletionTree::const_edge_iterator p = ind->node->begin(), p_end = ind->node->end(); p != p_end; ++p ) { const DlCompletionTreeArc* edge = *p; if ( edge->isNeighbour(r) ) vR = edge->getArcEnd(); else if ( edge->isNeighbour(s) ) vS = edge->getArcEnd(); if ( vR && vS ) { if ( fillDTReasoner ( Op1, vR ) ) break; if ( fillDTReasoner ( Op2, vS ) ) break; if ( checkDataRelation ( Op1, Op2, op ) ) Result.push_back(ind); break; } } } }
void FamilyTree::loadGEDCOM(const char* iFileName) { lube::filemodule gm("ged"); lube::file& vf = gm.create(); var ged = vf.read(iFileName); std::cout << "Individuals: " << ged["Individual"].size() << std::endl; std::cout << "Families: " << ged["Family"].size() << std::endl; // Add to graph for (int i=0; i<ged["Individual"].size(); i++) { // Rely on vertex, returned by add_vertex(), just being an // integer that increments with each call. vertex v = addIndividual(); if ((int)v != i) throw std::runtime_error( "FamilyTree::loadGEDCOM: vertex out of order" ); var& ind = getIndividual(v); ind = ged["Individual"][i]; } for (int i=0; i<ged["Family"].size(); i++) { var f = ged["Family"][i]; var h = f.at("HUSB"); var w = f.at("WIFE"); h.dereference(); w.dereference(); for (int c=0; c<f["CHIL"].size(); c++) { var k = f["CHIL"][c]; if (h) addRelationship(h.cast<int>(), k.cast<int>()); if (w) addRelationship(w.cast<int>(), k.cast<int>()); } } }