/// 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;
			}
		}
	}
}
Example #2
0
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>());
        }
    }
}