public VertexField GetVertexField(string vertexId, JObject currVertexObject = null, Dictionary <string, JObject> edgeDocSet = null)
        {
            try {
                this._lock.EnterUpgradeableReadLock();

                try {
                    this._lock.EnterWriteLock();

                    VertexField result;
                    if (!_cachedVertexField.TryGetValue(vertexId, out result))
                    {
                        JObject vertexObject = currVertexObject ?? this.Connection.RetrieveDocumentById(vertexId);
                        result = FieldObject.ConstructVertexField(this.Connection, vertexObject, edgeDocSet);
                        _cachedVertexField.Add(vertexId, result);
                    }
                    return(result);
                }
                finally {
                    if (this._lock.IsWriteLockHeld)
                    {
                        this._lock.ExitWriteLock();
                    }
                }
            }
            finally {
                if (this._lock.IsUpgradeableReadLockHeld)
                {
                    this._lock.ExitUpgradeableReadLock();
                }
            }
        }