diff --git a/rdf/parse.go b/rdf/parse.go
index b9412d36bf82b514a2af917d1366338f3ef7e953..4d38ed2d741ab2c651fc9a837cf4d987c9dd31ab 100644
--- a/rdf/parse.go
+++ b/rdf/parse.go
@@ -76,6 +76,9 @@ func Parse(line string) (rnq NQuad, rerr error) {
 		if item.Typ == itemValidEnd {
 			vend = true
 		}
+		if item.Typ == itemLabel {
+			rnq.Label = stripBracketsIfPresent(item.Val)
+		}
 	}
 	if !vend {
 		return rnq, fmt.Errorf("Invalid end of input")
diff --git a/rdf/parse_test.go b/rdf/parse_test.go
index fa14448ec573c27a1d122642c553266d381879c8..50a8741f75aff7cbcbf140ec73bec1ab83c248ef 100644
--- a/rdf/parse_test.go
+++ b/rdf/parse_test.go
@@ -150,6 +150,32 @@ var testNQuads = []struct {
 		},
 		hasErr: false,
 	},
+	{
+		input: `_:alice <knows> "stuff"^^<xs:string> <label> .`,
+		nq: NQuad{
+			Subject:     "_:alice",
+			Predicate:   "knows",
+			ObjectId:    "",
+			ObjectValue: "stuff@@xs:string",
+			Label:       "label",
+		},
+		hasErr: false,
+	},
+	{
+		input: `_:alice <knows> "stuff"^^<xs:string> _:label .`,
+		nq: NQuad{
+			Subject:     "_:alice",
+			Predicate:   "knows",
+			ObjectId:    "",
+			ObjectValue: "stuff@@xs:string",
+			Label:       "_:label",
+		},
+		hasErr: false,
+	},
+	{
+		input:  `_:alice <knows> "stuff"^^<xs:string> "label" .`,
+		hasErr: true,
+	},
 }
 
 func TestLex(t *testing.T) {
diff --git a/rdf/state.go b/rdf/state.go
index bc4d89255207d4c928df133959d3ad105d1e03ed..623cd37367b53f4cb5f1e6fa0a0821c98c63afc6 100644
--- a/rdf/state.go
+++ b/rdf/state.go
@@ -71,6 +71,11 @@ Loop:
 				l.Emit(itemText)
 				return lexObject
 
+			} else if l.Depth == AT_LABEL {
+				l.Backup()
+				l.Emit(itemText)
+				return lexLabel
+
 			} else {
 				return l.Errorf("Invalid input: %v at lexText", r)
 			}
@@ -133,7 +138,6 @@ func lexBlankNode(l *lex.Lexer, styp lex.ItemType,
 	}
 	if isSpace(r) {
 		l.Emit(styp)
-		l.Depth += 1
 		return sfn
 	}
 	return l.Errorf("Invalid character %v found for itemType: %v", r, styp)
@@ -147,6 +151,7 @@ func lexSubject(l *lex.Lexer) lex.StateFn {
 	}
 
 	if r == '_' {
+		l.Depth += 1
 		return lexBlankNode(l, itemSubject, lexText)
 	}
 
@@ -221,6 +226,7 @@ func lexObject(l *lex.Lexer) lex.StateFn {
 		return lexUntilClosing(l, itemObject, lexText)
 	}
 	if r == '_' {
+		l.Depth += 1
 		return lexBlankNode(l, itemObject, lexText)
 	}
 	if r == '"' {
@@ -231,6 +237,19 @@ func lexObject(l *lex.Lexer) lex.StateFn {
 	return l.Errorf("Invalid char: %v at lexObject", r)
 }
 
+func lexLabel(l *lex.Lexer) lex.StateFn {
+	r := l.Next()
+	if r == '<' {
+		l.Depth += 1
+		return lexUntilClosing(l, itemLabel, lexText)
+	}
+	if r == '_' {
+		l.Depth += 1
+		return lexBlankNode(l, itemLabel, lexText)
+	}
+	return l.Errorf("Invalid char: %v at lexLabel", r)
+}
+
 func isClosingBracket(r rune) bool {
 	return r == '>'
 }