Exemple #1
0
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;
}
Exemple #2
0
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;
}