Пример #1
0
    /// <summary>
    /// Copies a Node using another Node Factory
    /// </summary>
    /// <param name="original">Node to copy</param>
    /// <param name="target">Factory to copy into</param>
    /// <returns></returns>
    /// <remarks>
    /// <para>
    /// <strong>Warning:</strong> Copying Blank Nodes may lead to unforseen circumstances since no remapping of IDs between Factories is done
    /// </para>
    /// </remarks>
    public static INode CopyNode(INode original, INodeFactory target) {
      if (ReferenceEquals(original.Graph, target)) return original;

      switch (original.NodeType) {
        case NodeType.Blank:
          return target.CreateBlankNode(((IBlankNode)original).InternalID);
        case NodeType.GraphLiteral:
          return target.CreateGraphLiteralNode(((IGraphLiteralNode)original).SubGraph);
        case NodeType.Literal:
          ILiteralNode lit = (ILiteralNode)original;
          if (lit.DataType != null) {
            return target.CreateLiteralNode(lit.Value, lit.DataType);
          } else if (!lit.Language.Equals(String.Empty)) {
            return target.CreateLiteralNode(lit.Value, lit.Language);
          } else {
            return target.CreateLiteralNode(lit.Value);
          }
        case NodeType.Uri:
          return target.CreateUriNode(((IUriNode)original).Uri);
        case NodeType.Variable:
          return target.CreateVariableNode(((IVariableNode)original).VariableName);
        default:
          throw new RdfException("Unable to Copy '" + original.GetType().ToString() + "' Nodes between Node Factories");
      }
    }
Пример #2
0
        /// <summary>
        /// Creates a Node for the Context
        /// </summary>
        /// <param name="n">Node</param>
        /// <returns></returns>
        /// <remarks>
        /// <para>
        /// In effect all this does is ensure that all Nodes end up in the same Graph which may occassionally not happen otherwise when Graph wrappers are involved
        /// </para>
        /// </remarks>
        public INode GetNode(INode n)
        {
            if (_nodeMap == null)
            {
                _nodeMap = new MultiDictionary <INode, INode>(new FastVirtualNodeComparer());
            }

            if (_nodeMap.ContainsKey(n))
            {
                return(_nodeMap[n]);
            }

            INode temp;

            switch (n.NodeType)
            {
            case NodeType.Blank:
                temp = GetBlankNode(((IBlankNode)n).InternalID);
                break;

            case NodeType.Variable:
                IVariableNode v = (IVariableNode)n;
                temp = _factory.CreateVariableNode(v.VariableName);
                break;

            case NodeType.GraphLiteral:
                IGraphLiteralNode g = (IGraphLiteralNode)n;
                temp = _factory.CreateGraphLiteralNode(g.SubGraph);
                break;

            case NodeType.Uri:
                IUriNode u = (IUriNode)n;
                temp = _factory.CreateUriNode(u.Uri);
                break;

            case NodeType.Literal:
                ILiteralNode l = (ILiteralNode)n;
                if (l.DataType != null)
                {
                    temp = _factory.CreateLiteralNode(l.Value, l.DataType);
                }
                else if (!l.Language.Equals(String.Empty))
                {
                    temp = _factory.CreateLiteralNode(l.Value, l.Language);
                }
                else
                {
                    temp = _factory.CreateLiteralNode(l.Value);
                }
                break;

            default:
                throw new RdfQueryException("Cannot construct unknown Node Types");
            }
            _nodeMap.Add(n, temp);
            return(temp);
        }
Пример #3
0
 /// <summary>
 /// Creates a Graph Literal Node
 /// </summary>
 /// <returns></returns>
 public virtual IGraphLiteralNode CreateGraphLiteralNode()
 {
     return(_factory.CreateGraphLiteralNode());
 }
Пример #4
0
        /// <summary>
        /// Copies a Node using another Node Factory
        /// </summary>
        /// <param name="original">Node to copy</param>
        /// <param name="target">Factory to copy into</param>
        /// <returns></returns>
        /// <remarks>
        /// <para>
        /// <strong>Warning:</strong> Copying Blank Nodes may lead to unforseen circumstances since no remapping of IDs between Factories is done
        /// </para>
        /// </remarks>
        public static INode CopyNode(INode original, INodeFactory target)
        {
            if (ReferenceEquals(original.Graph, target)) return original;

            switch (original.NodeType)
            {
                case NodeType.Blank:
                    return target.CreateBlankNode(((IBlankNode)original).InternalID);
                case NodeType.GraphLiteral:
                    return target.CreateGraphLiteralNode(((IGraphLiteralNode)original).SubGraph);
                case NodeType.Literal:
                    ILiteralNode lit = (ILiteralNode)original;
                    if (lit.DataType != null)
                    {
                        return target.CreateLiteralNode(lit.Value, lit.DataType);
                    }
                    else if (!lit.Language.Equals(String.Empty))
                    {
                        return target.CreateLiteralNode(lit.Value, lit.Language);
                    }
                    else
                    {
                        return target.CreateLiteralNode(lit.Value);
                    }
                case NodeType.Uri:
                    return target.CreateUriNode(((IUriNode)original).Uri);
                case NodeType.Variable:
                    return target.CreateVariableNode(((IVariableNode)original).VariableName);
                default:
                    throw new RdfException("Unable to Copy '" + original.GetType().ToString() + "' Nodes between Node Factories");
            }
        }