bool CRDFNode::removeEdge(const CRDFPredicate & predicate, CRDFNode * pObject) { bool deletedSomething = false; // Determine whether the predicate points to a bag node std::set< CRDFTriplet > Triplets = mGraph.getTriplets(this, predicate); // Debugging assert(Triplets.size() > 0); CRDFNode * pTarget = Triplets.begin()->pObject; if (pTarget->isBagNode() && pTarget != pObject) { deletedSomething |= pTarget->removeEdge(CRDFPredicate::rdf_li, pObject); Triplets = mGraph.getTriplets(pTarget, CRDFPredicate::rdf_li); switch (Triplets.size()) { case 0: // If pTarget is an empty bag node we remove it. // Note, this will destroy pTarget, i.e., no need to unbag deletedSomething |= removeEdge(predicate, pTarget); break; default: // We have more than 1 rdf_li element left. break; } return deletedSomething; } deletedSomething |= removeTripletFromGraph(CRDFTriplet(this, predicate, pObject)); return deletedSomething; }
bool CRDFNode::setFieldValue(const std::string & value, const CRDFPredicate::ePredicateType & predicate, const CRDFPredicate::Path & nodePath) { std::set< CRDFTriplet > Triplets = getDescendantsWithPredicate(predicate); CRDFNode * pObject = NULL; if (Triplets.size() > 0) pObject = Triplets.begin()->pObject; // Check whether the value is not empty. if (value != "") { // We do not have an object if (pObject == NULL) { // We build each missing ancestor as a blank node. CRDFPredicate::sAllowedLocation const * pLocation = NULL; CRDFNode * pParent = createMissingAncestors(nodePath, predicate, pLocation); if (pParent == NULL) return false; // Create the missing object CRDFObject object; object.setType(pLocation->Type); if (object.getType() == CRDFObject::BLANK_NODE) object.setBlankNodeId(mGraph.generatedNodeId()); CRDFTriplet Triplet = mGraph.addTriplet(pParent->getSubject(), CRDFPredicate::getURI(predicate), object); if (!Triplet) return false; pObject = Triplet.pObject; // Debugging assert(pObject != NULL); } // Now we finally can save the information. CRDFObject & Object = pObject->getObject(); switch (Object.getType()) { case CRDFObject::LITERAL: { CRDFLiteral & Literal = Object.getLiteral(); Literal.setType(CRDFLiteral::PLAIN); Literal.setLexicalData(value); } break; case CRDFObject::RESOURCE: Object.setResource(value, false); break; case CRDFObject::BLANK_NODE: fatalError(); break; } } else if (pObject != NULL) removeTripletFromGraph(*Triplets.begin()); return true; }