diff --git a/src/query/frontend/ast/cypher_main_visitor.cpp b/src/query/frontend/ast/cypher_main_visitor.cpp
index 002860920..f5ab0c273 100644
--- a/src/query/frontend/ast/cypher_main_visitor.cpp
+++ b/src/query/frontend/ast/cypher_main_visitor.cpp
@@ -268,9 +268,12 @@ antlrcpp::Any CypherMainVisitor::visitProperties(
 antlrcpp::Any CypherMainVisitor::visitMapLiteral(
     CypherParser::MapLiteralContext *ctx) {
   std::map<GraphDbTypes::Property, Expression *> map;
-  for (int i = 0; i < (int)ctx->propertyKeyName().size(); ++i) {
-    map[ctx->propertyKeyName()[i]->accept(this)] =
-        ctx->expression()[i]->accept(this);
+  for (int i = 0; i < static_cast<int>(ctx->propertyKeyName().size()); ++i) {
+    GraphDbTypes::Property key = ctx->propertyKeyName()[i]->accept(this);
+    Expression *value = ctx->expression()[i]->accept(this);
+    if (!map.insert({key, value}).second) {
+      throw SemanticException("Same key can't appear twice in map literal");
+    }
   }
   return map;
 }
diff --git a/tests/unit/cypher_main_visitor.cpp b/tests/unit/cypher_main_visitor.cpp
index 443cdb387..733832614 100644
--- a/tests/unit/cypher_main_visitor.cpp
+++ b/tests/unit/cypher_main_visitor.cpp
@@ -674,6 +674,10 @@ TEST(CypherMainVisitorTest, NodePattern) {
                   Pair(ast_generator.db_accessor_->property("b"), 10)));
 }
 
+TEST(CypherMainVisitorTest, PropertyMapSameKeyAppearsTwice) {
+  EXPECT_THROW(AstGenerator("MATCH ({a : 1, a : 2})"), SemanticException);
+}
+
 TEST(CypherMainVisitorTest, NodePatternIdentifier) {
   AstGenerator ast_generator("MATCH (var) RETURN 1");
   auto *query = ast_generator.query_;